Обновить графики через слайдер (python) - PullRequest
1 голос
/ 17 июня 2020

У меня есть массив данных, который выглядит как data = [[1, 2, 3], [4, 5, 6], [7, 9, 10]....] и значения x x_values = np.arange(3).

Я хочу показать график для одного подмассива за раз и включить ползунок в свой график, значение которого должно представляют индекс соответствующего подмассива. Поэтому, когда я меняю ползунок, например, с 1 на 2, он должен измениться с построения data[1] на построение data[2] с моими значениями x.

Мой код выглядит примерно так:

#Initial plot
fig, ax = plt.subplots()
i = 0
plt.subplots_adjust(bottom = 0.15)
ax.plot(x_values, data[i])

#Update function
def update_wave(val):
    i = int(sliderwave.val)

    x_values = np.arange(3)
    ax.cla()
    ax.plot(x_values, data[i))
    fig.canvas.draw_idle()

#Sliders
axwave = plt.axes([0.25, 0.05, 0.5, 0.03])
sliderwave = Slider(axwave, 'Event No.', 0, 100, valinit=0, valfmt='%1.0f')

update_wave(i)
sliderwave.on_changed(update_wave)

Так не работает. Думаю, некоторые вещи не имеют смысла. Был бы признателен за помощь.

1 Ответ

1 голос
/ 17 июня 2020

Я думаю, вам не хватало только небольшой детали в вашем коде, а именно то, что вы хотите, чтобы ползунок принимал только дискретные значения. Если это то, чего вы хотели достичь, попробуйте этот код:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

# Define data set

DATA = np.random.uniform(1, 10, 300).reshape(-1, 3)
X_VALUES = np.arange(3)

# Initial plot

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.15)
ax.plot(X_VALUES, DATA[0], '-o')

# Update function


def update_wave(val):
    idx = int(sliderwave.val)
    ax.cla()
    ax.plot(X_VALUES, DATA[idx], '-o')
    fig.canvas.draw_idle()


# Sliders

axwave = plt.axes([0.25, 0.05, 0.5, 0.03])

sliderwave = Slider(axwave, 'Event No.', 0, 100, valinit=0, valfmt='%d')
sliderwave.on_changed(update_wave)

plt.show()

В этом примере я сгенерировал случайный набор данных для построения графика. Обратите внимание, что в объекте Slider я установил необязательный аргумент valfmt='%d', поэтому ползунок принимает только целые значения.

Edit

Если вы хотите добавить текстовое поле для выбора слайда число, то вам нужно будет добавить новые функции и объекты, например:

def submit(text):
    idx = int(text)
    ax.cla()
    ax.plot(X_VALUES, DATA[idx], '-o')
    fig.canvas.draw_idle()

axtext = plt.axes([0.25, 0.15, 0.5, 0.03])
text_box = TextBox(axtext, 'Slide No.')
text_box.on_submit(submit)

Если вы хотите, чтобы это работало вместе с ранее определенным ползунком, вы также должны изменить форму подзаголовков с помощью plt.subplots_adjust(bottom=0.25) например. Окончательный график будет выглядеть так: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...