Plote uma linha horizontal usando matplotlib

131

Usei a interpolação de spline para suavizar uma série temporal e também gostaria de adicionar uma linha horizontal ao gráfico. Mas parece haver um problema que está fora do meu alcance. Qualquer ajuda seria realmente útil. Aqui está o que eu tenho:

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

O problema parece estar no meu uso [0,len(xs)]para plotagem de linhas horizontais.

Ibe
fonte

Respostas:

5

Você está correto, acho que [0,len(xs)]está jogando com você. Você deseja reutilizar a variável original do eixo x xse plotá-la com outra matriz numpy do mesmo comprimento que a sua variável.

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

Espero que isso resolva o problema!

chill_turner
fonte
19
Isso funciona, mas não é particularmente eficiente, especialmente porque você está criando uma matriz potencialmente muito grande, dependendo dos dados. Se você fizer dessa maneira, seria mais inteligente ter dois pontos de dados, um no início e outro no final. Ainda assim, o matplotlib já possui uma função dedicada para linhas horizontais.
BlivetWidget 28/10
465

Você está procurando axhline(uma linha de eixo horizontal). Por exemplo, o seguinte fornecerá uma linha horizontal em y = 0.5:

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

figura de amostra

BlivetWidget
fonte
15
Docs: axhline.
manipula
1
O link dos documentos acima não está funcionando - link corrigido aqui: matplotlib.org/api/_as_gen/matplotlib.pyplot.axhline.html
Ender2050
31

Se você quiser desenhar uma linha horizontal nos eixos, tente também o ax.hlines()método É necessário especificar ya posição e xmine xmaxnos dados de coordenadas (ou seja, seus dados reais variam no eixo-x). Um trecho de código de exemplo é:

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

O trecho acima traçará uma linha horizontal nos eixos em y=0.2. A linha horizontal começa em x=4e termina em x=20. A imagem gerada é:

insira a descrição da imagem aqui

jdhao
fonte
isso é muito mais conveniente do que axhlinequando você precisa de um intervalo x específico da linha que pretendia desenhar. Qual é a diferença entre 'axhline' e 'hlines'?
Jason Goal
Em axhline, xmine xmaxsão em termos de coordenadas dos eixos, de modo que eles estejam no intervalo [0, 1]. Você pode ver aqui a diferença entre os diferentes sistemas de coordenadas.
Jdhao # 7/19
Obrigado, se essa xmine xmaxdiferença é a única diferença entre axhlinee hlines, o último não domina o primeiro?
Jason Goal
15

Use matplotlib.pyplot.hlines:

  • y pode ser transmitido como um único local: y=40
  • y pode ser transmitido como vários locais: y=[39, 40, 41]
  • Se você estiver plotando uma figura com algo parecido fig, ax = plt.subplots(), substitua plt.hlinesou plt.axhlinepor ax.hlinesou ax.axhline, respectivamente.
  • matplotlib.pyplot.axhlinesó pode plotar um único local (por exemplo 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()

insira a descrição da imagem aqui

Trenton McKinney
fonte
12

Além da resposta mais votada aqui, também é possível encadear axhlinedepois de chamar plotum pandas's DataFrame.

import pandas as pd

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

insira a descrição da imagem aqui

ayorgo
fonte
2

Uma maneira fácil e agradável para as pessoas que sempre esquecem o comando axhlineé o seguinte

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

No seu caso xs = xe y = 40. Se len (x) for grande, isso se tornará ineficiente e você realmente deve usar axhline.

LSchueler
fonte
2

Você pode usar plt.gridpara desenhar uma linha 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()

exemplo de plotagem de dados aleatórios

Mehdi
fonte