เขียนเส้นแนวนอนโดยใช้ 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และพล็อตที่มีอาร์เรย์ 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()

หวังว่าจะช่วยแก้ปัญหาได้!


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ในข้อมูลประสานงาน (เช่นช่วงข้อมูลที่แท้จริงของคุณในแกน x) ตัวอย่างโค้ดคือ:

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' และ 'hlines' คืออะไร
Jason Goal

ในaxhline, xminและxmaxอยู่ในรูปของพิกัดแกนเพื่อให้อยู่ในช่วง [0, 1] คุณสามารถดูความแตกต่างระหว่างระบบพิกัดที่นี่ได้ที่นี่
jdhao

ขอบคุณถ้าสิ่งนี้xminและxmaxความแตกต่างเป็นความแตกต่างเพียงอย่างเดียวระหว่างaxhlineและhlinesไม่ใช่สิ่งหลังนั้นครอบงำอดีตหรือไม่
Jason Goal

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บน'spandasDataFrame

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

ตัวอย่างแผนข้อมูลแบบสุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.