Je voudrais tracer des lignes courbes d'une forme spécifique en forme d'arche, ci-dessous est la mesure dans laquelle j'ai obtenu en utilisant des valeurs spécifiques (ces valeurs doivent être utilisées) mais il trace des lignes droites.

J'ai également du mal à formater l'axe y comme je le souhaite. C'est une échelle logarithmique et je voudrais qu'elle monte à 1 (comme dans l'intrigue idéale ci-dessus). Une aide serait formidable, merci! =)

3
Johnsonhesp 8 mars 2019 à 19:34

2 réponses

Meilleure réponse

La raison pour laquelle votre ligne ne s'étire pas sur un graphique à l'échelle logarithmique est qu'il n'y a aucun point entre les points qui sont en haut et en bas. log plot ne courbe pas les lignes, place seulement les points sur une échelle différente, la ligne entre eux est toujours droite.

Pour changer cela, nous ajoutons plus de points entre les points. et le résultat deviendra incurvé.

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import ScalarFormatter

# Data for plotting
t = [0.0, 62.5, 125.0, 187.5, 250, 312.5, 375, 437.5, 500]
s = [0.1, 0.005, 0.1, 0.005, 0.1, 0.005, 0.1, 0.005, 0.1]

def extendlist(l):
    master = []
    for i in range(len(l)-1):
        x = np.linspace(l[i], l[i+1], 50)
        master.extend(x)
    return master

t = extendlist(t)
s = extendlist(s)

fig, ax = plt.subplots()
ax.semilogy(t, s)

ax.set(xlabel='x axis', ylabel='y axis', title='Stuff')
plt.xlim((0,500))
plt.ylim((0.001, 1))

plt.show()

Cela générera ce que vous avez représenté sur papier.

enter image description here

2
Rocky Li 8 mars 2019 à 17:22

Vous pouvez utiliser interp1d

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d

t = [0.0, 62.5, 125.0, 187.5, 250, 312.5, 375, 437.5, 500]
s = [0.1, 0.005, 0.1, 0.005, 0.1, 0.005, 0.1, 0.005, 0.1]
tnew = np.linspace(0, 500, num=1001, endpoint=True)
f = interp1d(t, s)
plt.semilogy(tnew, f(tnew))
plt.ylim((0.001, 1))
plt.show()

resulting plot

1
Separius 8 mars 2019 à 18:12