พล็อต yerr / xerr เป็นพื้นที่แรเงาแทนที่จะเป็นแถบข้อผิดพลาด


142

ใน matplotlib ฉันจะลงจุดข้อผิดพลาดเป็นขอบเขตที่แรเงาแทนที่จะเป็นแถบข้อผิดพลาดได้อย่างไร

ตัวอย่างเช่น:

ป้อนคำอธิบายภาพที่นี่

ค่อนข้างมากกว่า

ป้อนคำอธิบายภาพที่นี่


1
พล็อตยอดนิยมสร้างขึ้นได้อย่างไร
MichaelSB

คำตอบ:


151

เมื่อมองข้ามการแก้ไขอย่างราบรื่นระหว่างจุดต่างๆในกราฟตัวอย่างของคุณ (ซึ่งต้องใช้การแก้ไขด้วยตนเองหรือเพียงแค่มีความละเอียดสูงกว่าข้อมูลของคุณ) คุณสามารถใช้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()

ป้อนคำอธิบายภาพที่นี่

ดูตัวอย่าง matplotlibด้วย


1
สมบูรณ์ ใช่ฉันไม่ได้ตั้งใจที่จะรวมตัวอย่างที่มีเส้นเรียบ
Austin Richardson

มีความคิดอย่างไรที่จะทำให้การแสดงนี้เป็นกล่องแรเงาแทนที่จะเป็นแถบสีเทา? สัญชาตญาณแรกของฉันคือการละเมิดlwแต่ดูเหมือนว่าจะไม่ใช้หน่วยเดียวกับแกน
Benjamin Bannier

@BenjaminBannier ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ดูเหมือนว่าคุณต้องการให้กล่องถูกวาดในแต่ละจุดความสูงของมันจะเท่ากับของแถบข้อผิดพลาดในขณะที่ความกว้างควรเป็นแบบที่พวกเขาเชื่อมต่อ (สัมผัส) กล่องที่อยู่ใกล้เคียง ถูกต้องหรือไม่

1
@EL_DON คุณหมายถึงคุณต้องการตำนานที่มีเส้นสีดำ + แถบสีน้ำเงินและข้อความจะเป็น "data + 1 sigma error region"?

1
@ Allan หากแถบข้อผิดพลาดเดียวที่คุณมีอยู่ในแนวนอนคุณอาจควรพลิกแกนของปัญหาที่แท้จริงของคุณ (และทำให้ได้ภาพด้วย) โดยปกติตัวแปรอิสระคือตัวแปรที่ไม่มีแถบข้อผิดพลาด (หรือมีขนาดเล็กมาก) คุณอาจโกงได้โดยการสลับตัวแปรข้อมูลของคุณและใน matplotlib ให้สลับแกนด้วย

131

นี่เป็นคำตอบเดียวกับที่ Evertให้ไว้ แต่ขยายออกไปเพื่อแสดงตัวเลือกที่น่าสนใจของfill_between

ป้อนคำอธิบายภาพที่นี่

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
ทางออกที่ดีกว่าเล็กน้อย: stackoverflow.com/questions/43064524/…
Shital Shah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.