J'ai utilisé l'interpolation par splines pour lisser une série chronologique et j'aimerais également ajouter une ligne horizontale au tracé. Mais il semble y avoir un problème qui est hors de ma portée. Toute aide serait vraiment utile. Voici ce que j'ai
annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')
plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()
le problème semble être lié à mon utilisation de [0,len(xs)]
pour le tracé de lignes horizontales.
Vous avez raison, je pense que la [0,len(xs)]
vous rejette. Vous voudrez réutiliser la variable d’axe x originale xs
et la tracer avec un autre tableau numpy de la même longueur que votre variable.
annual = np.arange(1,21,1)
l = np.array(value_list) # a list with 20 values
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
plt.plot(xs,spl(xs),'b')
#####horizontal line
horiz_line_data = np.array([40 for i in xrange(len(xs))])
plt.plot(xs, horiz_line_data, 'r--')
###########plt.plot([0,len(xs)],[40,40],'r--',lw=2)
pylab.ylim([0,200])
plt.show()
Espérons que cela règle le problème!
Vous recherchez axhline (une ligne d'axe horizontal). Ce qui suit vous donnera une ligne horizontale à y = 0.5, par exemple.
import matplotlib.pyplot as plt
plt.axhline(y=0.5, color='r', linestyle='-')
plt.show()
Si vous souhaitez dessiner une ligne horizontale dans les axes, vous pouvez également essayer la méthode ax.hlines () . Vous devez spécifier y
position et xmin
et xmax
dans les coordonnées de données (c.-à-d. Votre plage de données réelle dans l'axe x). Un extrait de code est:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1, 21, 200)
y = np.exp(-x)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.hlines(y=0.2, xmin=4, xmax=20, linewidth=2, color='r')
plt.show()
L'extrait ci-dessus tracera une ligne horizontale dans les axes en y=0.2
. La ligne horizontale commence à x=4
et se termine à x=20
. L'image générée est:
Un moyen simple et agréable pour ceux qui oublient toujours la commande axhline
est la suivante
plt.plot(x, [y]*len(x))
Dans votre cas, xs = x
et y = 40
. Si len (x) est grand, alors cela devient inefficace et vous devriez vraiment utiliser axhline
.
Vous pouvez utiliser plt.grid
pour dessiner une ligne horizontale.
import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import UnivariateSpline
from matplotlib.ticker import LinearLocator
# your data here
annual = np.arange(1,21,1)
l = np.random.random(20)
spl = UnivariateSpline(annual,l)
xs = np.linspace(1,21,200)
# plot your data
plt.plot(xs,spl(xs),'b')
# horizental line?
ax = plt.axes()
# three ticks:
ax.yaxis.set_major_locator(LinearLocator(3))
# plot grids only on y axis on major locations
plt.grid(True, which='major', axis='y')
# show
plt.show()