Постройте горизонтальную линию с помощью matplotlib

131

Я использовал сплайн-интерполяцию для сглаживания временного ряда, а также хотел бы добавить горизонтальную линию к графику. Но, похоже, есть проблема, которую я не могу понять. Любая помощь будет действительно полезной. Вот что у меня есть:

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

проблема, похоже, связана с тем, что я использую [0,len(xs)]для построения горизонтальных линий.

Ibe
источник

Ответы:

5

Вы правы, я думаю, [0,len(xs)]это вас сбивает. Вы захотите повторно использовать исходную переменную оси x xsи построить ее с другим массивом numpy той же длины, в котором находится ваша переменная.

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

Надеюсь, это решит проблему!

chill_turner
источник
19
Это работает, но не особенно эффективно, особенно если вы создаете потенциально очень большой массив в зависимости от данных. Если вы собираетесь сделать это таким образом, было бы разумнее иметь две точки данных, одну в начале и одну в конце. Тем не менее, в matplotlib уже есть специальная функция для горизонтальных линий.
BlivetWidget
467

Вы ищете axhline(горизонтальная ось). Например, следующее даст вам горизонтальную линию в y = 0.5:

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

образец рисунка

BlivetWidget
источник
15
Документы: axhline.
handle
1
Выше ссылка на документы не работает - исправленная ссылка здесь: matplotlib.org/api/_as_gen/matplotlib.pyplot.axhline.html
Ender2050
31

Если вы хотите провести горизонтальную линию по осям, вы также можете попробовать ax.hlines()метод. Необходимо указать yположение и xminи xmaxв данных координаты (т.е. в диапазон фактических данных в оси х). Пример фрагмента кода:

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

В приведенном выше фрагменте будет построена горизонтальная линия по осям в точке y=0.2. Горизонтальная линия начинается в x=4и заканчивается в x=20. Сгенерированное изображение:

введите описание изображения здесь

jdhao
источник
это намного удобнее, чем axhlineкогда вам нужен определенный диапазон x линии, которую вы собираетесь нарисовать. В чем разница между «axhline» и «hlines»?
Джейсон Гол
In axhline, xminи xmaxвыражены в координатах осей, так что они находятся в диапазоне [0, 1]. Вы можете увидеть здесь для разницы между различными системами координат.
jdhao
Спасибо, если это xminи xmaxразница - единственное различие между axhlineи hlines, разве последнее не доминирует над первым?
Джейсон Гол
15

Использование matplotlib.pyplot.hlines:

  • Можно построить несколько горизонтальных линии пропускания listк yпараметру.
  • y можно передать как одно местоположение: y=40
  • y можно передать как несколько местоположений: y=[39, 40, 41]
  • Если вы рисуете фигуру с чем-то вроде fig, ax = plt.subplots(), то замените plt.hlinesили plt.axhlineна ax.hlinesили ax.axhlineсоответственно.
  • matplotlib.pyplot.axhlineможно построить только одно место (например y=40)

plt.plot

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(6, 3))
plt.hlines(y=39.5, xmin=0, xmax=len(xs), colors='aqua', linestyles='--', lw=2, label='Single Line')
plt.hlines(y=[39, 40, 41], xmin=0, xmax=len(xs), colors='purple', linestyles='--', lw=2, label='Multiple Lines')
plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)

введите описание изображения здесь

ax.plot

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(1, 21, 200)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 6))

ax1.hlines(y=40, xmin=0, xmax=len(xs), colors='r', linestyles='--', lw=2)
ax1.set_title('One Line')

ax2.hlines(y=[39, 40, 41], xmin=0, xmax=len(xs), colors='purple', linestyles='--', lw=2)
ax2.set_title('Multiple Lines')

plt.show()

введите описание изображения здесь

Трентон МакКинни
источник
12

В дополнение к наиболее upvoted ответ здесь, можно также цепь axhlineпосле вызова plotна через pandas«с DataFrame.

import pandas as pd

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

введите описание изображения здесь

ayorgo
источник
2

Хороший и простой способ для тех, кто всегда забывает команду axhline:

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

В вашем случае xs = xи y = 40. Если len (x) велико, это становится неэффективным, и вам действительно следует использовать axhline.

LSchueler
источник
2

Вы можете использовать plt.gridдля рисования горизонтальной линии.

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

пример графика случайных данных

Мехди
источник