Zeichnen Sie eine horizontale Linie mit matplotlib

130

Ich habe die Spline-Interpolation verwendet, um eine Zeitreihe zu glätten, und möchte dem Plot auch eine horizontale Linie hinzufügen. Aber es scheint ein Problem zu geben, das ich nicht im Griff habe. Jede Hilfe wäre wirklich hilfreich. Folgendes habe ich:

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

Das Problem scheint bei meiner Verwendung [0,len(xs)]für das horizontale Zeichnen von Linien zu liegen.

Ich bin
quelle

Antworten:

5

Sie haben Recht, ich denke, das [0,len(xs)]wirft Sie ab. Sie möchten die ursprüngliche x-Achsen-Variable wiederverwenden xsund diese mit einem anderen numpy-Array derselben Länge zeichnen, in dem sich Ihre Variable befindet.

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

Hoffentlich behebt das das Problem!

chill_turner
quelle
19
Dies funktioniert, ist jedoch nicht besonders effizient, insbesondere da Sie abhängig von den Daten ein potenziell sehr großes Array erstellen. Wenn Sie dies auf diese Weise tun, wäre es klüger, zwei Datenpunkte zu haben, einen am Anfang und einen am Ende. Dennoch hat matplotlib bereits eine spezielle Funktion für horizontale Linien.
BlivetWidget
462

Sie suchen axhline(eine horizontale Achsenlinie). Im Folgenden erhalten Sie beispielsweise eine horizontale Linie bei y = 0.5:

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

Beispielfigur

BlivetWidget
quelle
15
Dokumente : axhline.
behandeln
1
Der obige Link funktioniert nicht - korrigierter Link hier: matplotlib.org/api/_as_gen/matplotlib.pyplot.axhline.html
Ender2050
31

Wenn Sie eine horizontale Linie in den Achsen zeichnen möchten, können Sie auch die ax.hlines()Methode ausprobieren . Sie müssen die yPosition und xminund xmaxin der Datenkoordinate angeben (dh Ihren tatsächlichen Datenbereich auf der x-Achse). Ein Beispielcode-Snippet lautet:

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

Das obige Snippet zeichnet eine horizontale Linie in den Achsen bei y=0.2. Die horizontale Linie beginnt bei x=4und endet bei x=20. Das erzeugte Bild ist:

Geben Sie hier die Bildbeschreibung ein

jdhao
quelle
Dies ist viel praktischer als axhlinewenn Sie einen bestimmten x-Bereich der Linie benötigen, die Sie zeichnen möchten. Was ist der Unterschied zwischen "Axhline" und "Hlines"?
Jason Goal
In axhlinesind die xminund xmaxin Bezug auf die Achsen so koordiniert, dass sie im Bereich [0, 1] liegen. Sie können sehen , hier zwischen den verschiedenen Koordinatensystemen für einen Unterschied.
JDHAO
Danke, wenn dies xminund der xmaxUnterschied der einzige Unterschied zwischen axhlineund hlinesist, dominiert nicht der letztere den ersteren?
Jason Goal
15

Verwendung matplotlib.pyplot.hlines:

  • y kann als einzelner Ort übergeben werden: y=40
  • y kann als mehrere Speicherorte übergeben werden: y=[39, 40, 41]
  • Wenn Sie eine Figur mit so etwas zeichnen fig, ax = plt.subplots(), ersetzen Sie plt.hlinesoder plt.axhlinedurch ax.hlinesoder ax.axhline.
  • matplotlib.pyplot.axhlinekann nur einen einzigen Ort zeichnen (zB 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()

Geben Sie hier die Bildbeschreibung ein

Trenton McKinney
quelle
12

Zusätzlich zu der am besten bewerteten Antwort hier kann man auch axhlinenach dem Aufrufen plotvon a pandas's verketten DataFrame.

import pandas as pd

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

Geben Sie hier die Bildbeschreibung ein

Ayorgo
quelle
2

Ein schöner und einfacher Weg für diejenigen, die den Befehl immer vergessen, axhlineist der folgende

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

In deinem Fall xs = xund y = 40. Wenn len (x) groß ist, wird dies ineffizient und Sie sollten es wirklich verwenden axhline.

LSchueler
quelle
2

Sie können plt.grideine horizontale Linie zeichnen.

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

Beispiel für ein zufälliges Datenplot

Mehdi
quelle