Vẽ một đường ngang bằng matplotlib


131

Tôi đã sử dụng phép nội suy spline để làm mịn chuỗi thời gian và cũng muốn thêm một đường ngang vào cốt truyện. Nhưng dường như có một vấn đề nằm ngoài tầm kiểm soát của tôi. Bất kỳ trợ giúp sẽ thực sự hữu ích. Đây là những gì tôi có:

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

vấn đề dường như là với việc tôi sử dụng [0,len(xs)]cho âm mưu đường ngang.

Câu trả lời:


5

Bạn là chính xác, tôi nghĩ rằng [0,len(xs)]đang ném bạn đi. Bạn sẽ muốn sử dụng lại biến trục x gốc xsvà vẽ đồ thị với một mảng numpy khác có cùng độ dài có biến của bạn trong đó.

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

Hy vọng rằng sẽ khắc phục vấn đề!


19
Điều này hoạt động, nhưng nó không đặc biệt hiệu quả, đặc biệt là khi bạn đang tạo ra một mảng có khả năng rất lớn tùy thuộc vào dữ liệu. Nếu bạn định làm theo cách này, sẽ thông minh hơn khi có hai điểm dữ liệu, một ở đầu và một ở cuối. Tuy nhiên, matplotlib đã có một chức năng dành riêng cho các đường ngang.
BlivetWidget


31

Nếu bạn muốn vẽ một đường ngang trong các trục, bạn cũng có thể thử ax.hlines()phương pháp. Bạn cần phải xác định yvị trí và xminxmaxtrong các dữ liệu phối hợp (ví dụ, số liệu thực tế của bạn dao động trong trục x). Một đoạn mã mẫu là:

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ạn mã trên sẽ vẽ một đường ngang trong các trục tại y=0.2. Đường ngang bắt đầu tại x=4và kết thúc tại x=20. Hình ảnh được tạo là:

nhập mô tả hình ảnh ở đây


điều này thuận tiện hơn nhiều so với axhlinekhi bạn cần một phạm vi x cụ thể của dòng bạn định vẽ. Sự khác biệt giữa 'axhline' và 'hlines' là gì?
Jason Goal

Trong axhline, xminxmaxvề mặt tọa độ trục sao cho chúng nằm trong phạm vi [0, 1]. Bạn có thể thấy ở đây cho một sự khác biệt giữa các hệ tọa độ khác nhau.
jdhao

Cảm ơn, nếu điều này xminxmaxsự khác biệt là sự khác biệt duy nhất giữa axhlinehlines, không phải cái sau sẽ thống trị cái trước sao?
Jason Goal

15

Sử dụng matplotlib.pyplot.hlines:

  • y có thể được thông qua dưới dạng một vị trí: y=40
  • y có thể được thông qua dưới dạng nhiều địa điểm: y=[39, 40, 41]
  • Nếu bạn đang vẽ một hình với một cái gì đó như thế fig, ax = plt.subplots(), thì thay thế plt.hlineshoặc plt.axhlinebằng ax.hlineshoặc ax.axhline, tương ứng.
  • matplotlib.pyplot.axhlinechỉ có thể vẽ một vị trí duy nhất (ví dụ 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()

nhập mô tả hình ảnh ở đây


12

Ngoài các câu trả lời upvoted nhất ở đây, người ta cũng có thể chuỗi axhlinesau khi gọi plotvề một pandas's DataFrame.

import pandas as pd

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

nhập mô tả hình ảnh ở đây


2

Một cách hay và dễ dàng cho những người luôn quên lệnh axhlinelà như sau

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

Trong trường hợp của bạn xs = xy = 40. Nếu len (x) lớn, thì điều này trở nên không hiệu quả và bạn thực sự nên sử dụng axhline.


2

Bạn có thể sử dụng plt.gridđể vẽ một đường ngang.

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

ví dụ lô dữ liệu ngẫu nhiên

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.