Vẽ đồ thị yerr / xerr dưới dạng vùng bóng mờ thay vì các thanh lỗi


142

Trong matplotlib, làm cách nào để vẽ lỗi như một vùng bóng mờ thay vì các thanh lỗi?

Ví dụ:

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

thay vì

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


1
Làm thế nào cốt truyện hàng đầu được tạo ra?
MichaelSB

Câu trả lời:


151

Bỏ qua phép nội suy trơn tru giữa các điểm trong biểu đồ ví dụ của bạn (điều đó sẽ yêu cầu thực hiện một số phép nội suy thủ công hoặc chỉ có độ phân giải cao hơn của dữ liệu của bạn), bạn có thể sử dụng pyplot.fill_between():

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape)
y += np.random.normal(0, 0.1, size=y.shape)

plt.plot(x, y, 'k-')
plt.fill_between(x, y-error, y+error)
plt.show()

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

Xem thêm các ví dụ matplotlib .


1
Hoàn hảo. Vâng, tôi không có ý bao gồm một ví dụ với các dòng được làm mịn.
Austin Richardson

Bất kỳ ý tưởng làm thế nào để làm cho chương trình này bóng mờ hộp thay vì một ban nhạc bóng mờ? Bản năng đầu tiên của tôi là lạm dụng lwnhưng dường như không sử dụng các đơn vị giống như các trục.
Benjamin Bannier

@BenjaminBannier Tôi không hoàn toàn chắc chắn về ý của bạn. Nghe có vẻ như bạn muốn một hộp được vẽ ở mỗi điểm, chiều cao của nó tương đương với thanh lỗi, trong khi chiều rộng phải sao cho chúng kết nối (chạm) vào các hộp lân cận. Đúng không?

1
@EL_DON Ý bạn là bạn muốn một huyền thoại có vạch đen + dải màu xanh và văn bản sẽ giống như "vùng dữ liệu + 1 vùng sigma"?

1
@ ALLan nếu các thanh lỗi duy nhất bạn có nằm ngang, có lẽ bạn nên lật các trục của vấn đề thực tế của bạn (và do đó cũng là con số). Thông thường, biến độc lập là biến không có (hoặc có rất nhỏ) thanh lỗi. Bạn có thể gian lận, bằng cách hoán đổi các biến dữ liệu của mình và trong matplotlib, cũng trao đổi các trục.

131

Về cơ bản, đây là câu trả lời tương tự do Evert cung cấp , nhưng được mở rộng để thể hiện một số tùy chọn thú vị củafill_between

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

from matplotlib import pyplot as pl
import numpy as np

pl.clf()
pl.hold(1)

x = np.linspace(0, 30, 100)
y = np.sin(x) * 0.5
pl.plot(x, y, '-k')


x = np.linspace(0, 30, 30)
y = np.sin(x/6*np.pi)
error = np.random.normal(0.1, 0.02, size=y.shape) +.1
y += np.random.normal(0, 0.1, size=y.shape)

pl.plot(x, y, 'k', color='#CC4F1B')
pl.fill_between(x, y-error, y+error,
    alpha=0.5, edgecolor='#CC4F1B', facecolor='#FF9848')

y = np.cos(x/6*np.pi)    
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#1B2ACC')
pl.fill_between(x, y-error, y+error,
    alpha=0.2, edgecolor='#1B2ACC', facecolor='#089FFF',
    linewidth=4, linestyle='dashdot', antialiased=True)



y = np.cos(x/6*np.pi)  + np.sin(x/3*np.pi)  
error = np.random.rand(len(y)) * 0.5
y += np.random.normal(0, 0.1, size=y.shape)
pl.plot(x, y, 'k', color='#3F7F4C')
pl.fill_between(x, y-error, y+error,
    alpha=1, edgecolor='#3F7F4C', facecolor='#7EFF99',
    linewidth=0)



pl.show()

1
Giải pháp tốt hơn một chút: stackoverflow.com/questions/43064524/ từ
Shital Shah
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.