Trazar una línea horizontal usando matplotlib

131

He usado la interpolación de spline para suavizar una serie de tiempo y también me gustaría agregar una línea horizontal al diagrama. Pero parece que hay un problema que está fuera de mi alcance. Cualquier ayuda sería realmente útil. Esto es lo que tengo:

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

El problema parece estar con mi uso de [0,len(xs)]para el trazado de líneas horizontales.

Ibe
fuente

Respuestas:

5

Tienes razón, creo que [0,len(xs)]te está desanimando. Deberá reutilizar la variable original del eje x xsy trazarla con otra matriz numpy de la misma longitud que contenga su 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()

¡Esperemos que eso solucione el problema!

chill_turner
fuente
19
Esto funciona, pero no es particularmente eficiente, especialmente porque está creando una matriz potencialmente muy grande dependiendo de los datos. Si lo va a hacer de esta manera, sería más inteligente tener dos puntos de datos, uno al principio y otro al final. Aún así, matplotlib ya tiene una función dedicada para líneas horizontales.
BlivetWidget
465

Estás buscando axhline(una línea de eje horizontal). Por ejemplo, lo siguiente le dará una línea horizontal en y = 0.5:

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

figura de muestra

BlivetWidget
fuente
15
Docs: axhline.
manejar
1
El enlace anterior no funciona - enlace corregido aquí: matplotlib.org/api/_as_gen/matplotlib.pyplot.axhline.html
Ender2050
31

Si desea dibujar una línea horizontal en los ejes, también puede probar el ax.hlines()método. Es necesario especificar yla posición y xminy xmaxen los datos de coordenadas (es decir, los datos reales varían en el eje x). Un fragmento de código de muestra es:

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

El fragmento de arriba trazará una línea horizontal en los ejes en y=0.2. La línea horizontal comienza en x=4y termina en x=20. La imagen generada es:

ingrese la descripción de la imagen aquí

jdhao
fuente
Esto es mucho más conveniente que axhlinecuando necesita un rango x específico de la línea que pretendía dibujar. ¿Cuál es la diferencia entre 'axhline' y 'hlines'?
Jason Goal
En axhline, los xminy xmaxestán en términos de coordenadas de ejes para que estén en el rango [0, 1]. Puede ver aquí una diferencia entre los diferentes sistemas de coordenadas.
jdhao
Gracias, si esto xminy la xmaxdiferencia es la única diferencia entre axhliney hlines, ¿no es el último el que domina al primero?
Jason Goal
15

Uso matplotlib.pyplot.hlines:

  • y se puede pasar como una ubicación única: y=40
  • y se puede pasar como múltiples ubicaciones: y=[39, 40, 41]
  • Si estás trazando una figura con algo así fig, ax = plt.subplots(), entonces reemplaza plt.hlineso plt.axhlinecon ax.hlineso ax.axhline, respectivamente.
  • matplotlib.pyplot.axhlinesolo puede trazar una sola ubicación (por ejemplo 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()

ingrese la descripción de la imagen aquí

Trenton McKinney
fuente
12

Además de la respuesta más votada aquí, también se puede encadenar axhlinedespués de llamar plota un pandas's DataFrame.

import pandas as pd

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

ingrese la descripción de la imagen aquí

ayorgo
fuente
2

Una manera agradable y fácil para aquellas personas que siempre olvidan el comando axhlinees la siguiente

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

En tu caso xs = xy y = 40. Si len (x) es grande, entonces esto se vuelve ineficiente y realmente debería usarlo axhline.

LSchueler
fuente
2

Puedes usar plt.gridpara dibujar una línea horizontal.

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

ejemplo de gráfico de datos aleatorios

Mehdi
fuente