Traccia una linea orizzontale usando matplotlib


131

Ho usato l'interpolazione spline per smussare una serie temporale e vorrei anche aggiungere una linea orizzontale alla trama. Ma sembra esserci un problema che è fuori dai miei limiti. Qualsiasi assistenza sarebbe davvero utile. Ecco cosa ho:

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

il problema sembra essere con il mio uso di [0,len(xs)]per la stampa di linee orizzontali.

Risposte:


5

Hai ragione, penso che ti [0,len(xs)]stia buttando via. Ti consigliamo di riutilizzare la variabile originale dell'asse x xse di tracciarla con un altro array intorpidito della stessa lunghezza che contiene la variabile.

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

Speriamo che risolva il problema!


19
Funziona, ma non è particolarmente efficiente, soprattutto perché stai creando un array potenzialmente molto grande a seconda dei dati. Se lo farai in questo modo, sarebbe più intelligente avere due punti dati, uno all'inizio e uno alla fine. Tuttavia, matplotlib ha già una funzione dedicata per le linee orizzontali.
BlivetWidget il


31

Se si desidera tracciare una linea orizzontale negli assi, è possibile provare anche il ax.hlines()metodo. È necessario specificare la yposizione e xmine xmaxnella coordinata dei dati (ovvero l'intervallo di dati effettivo nell'asse x). Un frammento di codice di esempio è:

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

Lo snippet sopra traccia una linea orizzontale negli assi in y=0.2. La linea orizzontale inizia alle x=4e termina alle x=20. L'immagine generata è:

inserisci qui la descrizione dell'immagine


questo è molto più conveniente rispetto a axhlinequando è necessario un intervallo x specifico della linea che si intende disegnare. Qual è la differenza tra 'axhline' e 'hlines'?
Jason Goal,

In axhline, xmine xmaxsono in termini di coordinate degli assi in modo che siano nell'intervallo [0, 1]. Puoi vedere qui per una differenza tra i diversi sistemi di coordinate.
jdhao,

Grazie, se questa xmine la xmaxdifferenza è l'unica differenza tra axhlinee hlines, la seconda non domina la prima?
Jason Goal

15

Utilizzare matplotlib.pyplot.hlines:

  • y può essere passato come una singola posizione: y=40
  • y può essere passato come più posizioni: y=[39, 40, 41]
  • Se stai tracciando una figura con qualcosa di simile fig, ax = plt.subplots(), sostituisci plt.hlineso plt.axhlinecon ax.hlineso ax.axhline, rispettivamente.
  • matplotlib.pyplot.axhlinepuò tracciare una sola posizione (ad es. 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()

inserisci qui la descrizione dell'immagine


12

In aggiunta alla risposta più upvoted qui, si può anche a catena axhlinedopo la chiamata plotsu un pandas's DataFrame.

import pandas as pd

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

inserisci qui la descrizione dell'immagine


2

Un modo semplice e piacevole per quelle persone che dimenticano sempre il comando axhlineè il seguente

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

Nel tuo caso xs = xe y = 40. Se len (x) è grande, allora questo diventa inefficiente e dovresti davvero usarlo axhline.


2

Puoi usare plt.gridper disegnare una linea orizzontale.

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

esempio di diagramma di dati casuali

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.