Tracez une ligne horizontale en utilisant matplotlib

131

J'ai utilisé l'interpolation spline 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()

problème semble être avec mon utilisation de [0,len(xs)]pour le traçage de lignes horizontales.

Ibe
la source

Réponses:

5

Vous avez raison, je pense que cela [0,len(xs)]vous dérange. Vous voudrez réutiliser la variable originale de l'axe des x xset la tracer avec un autre tableau numpy de la même longueur qui contient 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ésout le problème!

chill_turner
la source
19
Cela fonctionne, mais ce n'est pas particulièrement efficace, d'autant plus que vous créez un tableau potentiellement très grand en fonction des données. Si vous procédez de cette façon, il serait plus intelligent d'avoir deux points de données, un au début et un à la fin. Pourtant, matplotlib a déjà une fonction dédiée aux lignes horizontales.
BlivetWidget
466

Vous recherchez axhline(une ligne d'axe horizontal). Par exemple, ce qui suit vous donnera une ligne horizontale à y = 0.5:

import matplotlib.pyplot as plt
plt.axhline(y=0.5, color='r', linestyle='-')
plt.show()

exemple de figure

BlivetWidget
la source
15
Docs: axhline.
manche le
1
Le lien ci-dessus vers les documents ne fonctionne pas - lien corrigé ici: matplotlib.org/api/_as_gen/matplotlib.pyplot.axhline.html
Ender2050
31

Si vous souhaitez dessiner une ligne horizontale dans les axes, vous pouvez également essayer la ax.hlines()méthode. Vous devez spécifier la yposition et xminet xmaxdans les coordonnées des données (c'est-à-dire votre plage de données réelle sur l'axe des x). Un exemple d'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 à y=0.2. La ligne horizontale commence à x=4et se termine à x=20. L'image générée est:

entrez la description de l'image ici

jdhao
la source
c'est beaucoup plus pratique que axhlinelorsque vous avez besoin d'une plage x spécifique de la ligne que vous avez l'intention de dessiner. Quelle est la différence entre «axhline» et «hlines»?
Objectif de Jason le
Dans axhline, les xminet xmaxsont en termes de coordonnées d'axes afin qu'ils soient dans la plage [0, 1]. Vous pouvez voir ici la différence entre les différents systèmes de coordonnées.
jdhao
Merci, si ceci xminet la xmaxdifférence est la seule différence entre axhlineet hlines, ce dernier ne domine-t-il pas le premier?
Objectif de Jason le
15

Utilisez matplotlib.pyplot.hlines:

  • y peut être transmis comme un emplacement unique: y=40
  • y peut être transmis comme plusieurs emplacements: y=[39, 40, 41]
  • Si vous tracez une figure avec quelque chose comme fig, ax = plt.subplots(), remplacez plt.hlinesou plt.axhlinepar ax.hlinesou ax.axhline, respectivement.
  • matplotlib.pyplot.axhlinene peut tracer qu'un seul emplacement (par exemple y=40)
import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(1, 21, 200)
plt.hlines(y=40, xmin=0, xmax=len(xs), colors='r', linestyles='--', lw=2)
plt.show()

entrez la description de l'image ici

Trenton McKinney
la source
12

En plus de la réponse la plus positive ici, on peut également enchaîner axhlineaprès avoir appelé plotun pandas's DataFrame.

import pandas as pd

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

entrez la description de l'image ici

ayorgo
la source
2

Un moyen simple et agréable pour les personnes qui oublient toujours la commande axhlineest le suivant

plt.plot(x, [y]*len(x))

Dans votre cas xs = xet y = 40. Si len (x) est grand, cela devient inefficace et vous devriez vraiment l'utiliser axhline.

LSchueler
la source
2

Vous pouvez utiliser plt.gridpour 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()

exemple de graphique de données aléatoires

Mehdi
la source