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.

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!


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


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


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


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


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.