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.

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!


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


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


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


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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.