web-dev-qa-db-fra.com

Tracer une ligne horizontale à l'aide de matplotlib

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.

89
Ibe

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!

7
chill_turner

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()

sample figure

312
BlivetWidget

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:

enter image description here

17
jdhao

En plus de la réponse la plus votée ici, on peut aussi chaîner axhline après avoir appelé plot sur un pandas 'DataFrame.

import pandas as pd

(pd.DataFrame([1, 2, 3])
   .plot(kind='bar', color='orange')
   .axhline(y=1.5));

enter image description here

4
ayorgo

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.

2
MosteM

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()

random data plot example

1
Mehdi