matplotlib.widgets.Slider с fill_between - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь добавить ползунок в график, аналогичный демонстрационному примеру слайдера .

Я рисую fill_between , что дает PolyCollection объект.

Хотя я пробовал с plot тоже, который дает Line2D объект, как показано на рисунке ниже, но график не обновляется так, как ожидалось, как в демо .

enter image description here

код

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

1 Ответ

1 голос
/ 27 мая 2020

Чтобы обновить линейный график, необходимо установить 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...