Накресліть горизонтальну лінію за допомогою 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)]для побудови горизонтальної лінії.

Відповіді:


5

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

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

Сподіваємось, це вирішить проблему!


19
Це працює, але це не особливо ефективно, тим більше що ви створюєте потенційно дуже великий масив залежно від даних. Якщо ви збираєтесь це зробити так, було б розумніше мати дві точки даних, одну на початку та одну в кінці. Тим не менш, matplotlib вже має виділену функцію для горизонтальних ліній.
BlivetWidget

466

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

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

зразок фігури


15
Документи: axhline.
обробляти

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. Створене зображення:

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


це набагато зручніше, ніж axhlineколи вам потрібен певний діапазон x лінії, яку ви мали намір намалювати. Яка різниця між «осьовою лінією» та «лінією»?
Гол Джейсона

В axhline, осі xminі xmaxзнаходяться по осях, координуються так, що вони знаходяться в діапазоні [0, 1]. Ви можете побачити тут для різниці між різними системами координат.
jdhao

Спасибі, якщо це xminі xmaxрізниця в тому , єдина відмінність між axhlineі hlines, не останній домінує колишній?
Гол Джейсона

15

Використання matplotlib.pyplot.hlines:

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

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


12

На додаток до найбільш upvoted відповідь тут, можна також ланцюг axhlineпісля виклику plotна через pandas«з DataFrame.

import pandas as pd

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

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


2

Гарний і простий спосіб для тих людей, які завжди забувають команду, axhlineполягає в наступному

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

У вашому випадку xs = xі y = 40. Якщо len (x) великий, то це стає неефективним, і ви дійсно повинні використовувати axhline.


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

приклад діаграми випадкових даних

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.