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.

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!


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


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í


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í


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í


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.