簡體   English   中英

matplotlib.widgets.Slider with fill_between

[英]matplotlib.widgets.Slider with fill_between

我正在嘗試在 plot 中添加 slider ,類似於slider 演示示例

我正在繪制fill_between ,它給出了PolyCollection object。

盡管我也嘗試使用plot給出Line2D object 如下圖所示,但是 plot 沒有像 演示中的預期那樣更新。

在此處輸入圖像描述

代碼

import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
import matplotlib.widgets as widgets

def get_pdf(mu, sigma=1, offset=4):
    o = sigma * offset
    x = np.linspace(mu - o, mu + o, 100)
    rv = ss.norm(mu, sigma)
    return x, rv.pdf(x)

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
ax.fill_between(*get_pdf(0, 1), alpha=0.7)
# t = plt.fill_between(*get_pdf(2, 1), alpha=0.7) # this gives ployCollection
t = ax.plot(*get_pdf(2, 1), label='treatment', alpha=0.7)

a = plt.axes([0.25, 0.1, 0.5, 0.03])

slider = widgets.Slider(a, "shift", 0, 10, valinit=2, valstep=1)
def update(val):
    x, y = get_pdf(val)
    t[0].set_ydata(y)
    fig.canvas.draw_idle()

slider.on_changed(update)
plt.show()

要更新 plot 行,需要設置t[0].set_xdata(x) ,因為每個調用都不同。 在這種特殊情況下, get_pdf每次都返回相同的y

更新由polyCollection生成的fill_between的坐標似乎是不可能的。 但是,您可以在每次更新時刪除並重新創建它。 請注意,這比僅更新坐標要慢。

import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
import matplotlib.widgets as widgets

def get_pdf(mu, sigma=1, offset=4):
    o = sigma * offset
    x = np.linspace(mu - o, mu + o, 100)
    rv = ss.norm(mu, sigma)
    return x, rv.pdf(x)

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)
ax.fill_between(*get_pdf(0, 1), alpha=0.7)
t = ax.fill_between(*get_pdf(2), color='crimson', alpha=0.7)
a = plt.axes([0.25, 0.1, 0.5, 0.03])

slider = widgets.Slider(a, "shift", 0, 10, valinit=2, valstep=1)
def update(val):
    global t
    t.remove()
    t = ax.fill_between(*get_pdf(val), color='crimson', alpha=0.7)
    fig.canvas.draw_idle()

slider.on_changed(update)
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM