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.

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!


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


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


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


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


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.