Как починить слайдер? Он работает не так, как задумано - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь создать ползунок, который будет устанавливать ячейки в matplotlib, вот мой код:

%matplotlib notebook
import matplotlib.pyplot as plt
from matplotlib.pyplot import ion
import numpy as np
import matplotlib.animation as animation
from matplotlib.widgets import RadioButtons
from matplotlib.widgets import Slider


# generate 4 random variables from the random, gamma, exponential, and uniform distributions
sample_size = 10000
normal = np.random.normal(loc=0.0, scale=1.0, size=sample_size)
gamma = np.random.gamma(shape = 1.0, scale=1.0, size=sample_size)
uniform = np.random.uniform(low=0.0, high=10.0, size=sample_size)
exponential = np.random.exponential(scale=1.0, size=sample_size)

fig, sub_plt = plt.subplots()
plt.subplots_adjust(top=0.65) # Adjust subplot to not overlap with radio box

axcolor = 'lightgoldenrodyellow'
rax = plt.axes([0.05, 0.7, 0.25, 0.25], facecolor=axcolor)
axfreq = plt.axes([0.20, 0.02, 0.65, 0.03], facecolor=axcolor)
radio = RadioButtons(rax, ('Normal', 'Gamma', 'Uniform', 'Exponential'))
slide = Slider(axfreq, 'Bins', 10.0,200.0,valinit=30.0)

def dist_func(type_l):
    sub_plt.clear() # comment this line if you want to keep previous drawings
    dist_dict = {'Normal':normal, 'Gamma':gamma, 'Uniform':uniform, 'Exponential':exponential}
    data_type = dist_dict[type_l]
    sub_plt.hist(data_type, bins=100)


radio.on_clicked(dist_func)

def bin_func(val):
    slide_val = slide.val
    plt.figure()
    sub_plt.hist(data_type,bins=slide_val)
    fig.canvas.draw_idle()


 slide.on_changed(bin_func)

 plt.show()

Я хочу, чтобы значение ползунка устанавливало ячейки гистограммы. Это отображает ползунок, но ползунок не устанавливает ячейки, как предполагалось, фактически он ничего не делает. Есть ли способ заставить мусорные ведра работать так, как задумано?

1 Ответ

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

Я считаю, что sub_plt.hist(data_type,bins=slide_val) - это проблема, data_type не является глобальной переменной, поэтому вы не можете создать график с неопределенной переменной.

Я переместил код перерисовки холста внутрь dist_func, так что нажатие одной из радиокнопок меняет aws график без перемещения ползунка.

Также важно убедиться, что значение ползунка является целым числом (должно иметь дискретное количество ячеек!)

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

# generate 4 random variables from the random, gamma, exponential, and uniform distributions
sample_size = 10000
normal = np.random.normal(loc=0.0, scale=1.0, size=sample_size)
gamma = np.random.gamma(shape=1.0, scale=1.0, size=sample_size)
uniform = np.random.uniform(low=0.0, high=10.0, size=sample_size)
exponential = np.random.exponential(scale=1.0, size=sample_size)

fig, sub_plt = plt.subplots()
plt.subplots_adjust(top=0.65)  # Adjust subplot to not overlap with radio box

axcolor = 'lightgoldenrodyellow'
rax = plt.axes([0.05, 0.7, 0.25, 0.25], facecolor=axcolor)
axfreq = plt.axes([0.20, 0.02, 0.65, 0.03], facecolor=axcolor)
radio = RadioButtons(rax, ('Normal', 'Gamma', 'Uniform', 'Exponential'))
slide = Slider(axfreq, 'Bins', 10.0, 200.0, valinit=30.0, valstep=1)

dist_dict = {'Normal': normal, 'Gamma': gamma, 'Uniform': uniform, 'Exponential': exponential}


def dist_func(type_l, bins=100):
    sub_plt.clear()  # comment this line if you want to keep previous drawings
    data_type = dist_dict[type_l]
    sub_plt.hist(data_type, bins=bins)
    fig.canvas.draw_idle()


radio.on_clicked(dist_func)


def update(a):
    dist_func(radio.value_selected, bins=int(a))



# the final step is to specify that the slider needs to
# execute the above function when its value changes
slide.on_changed(update)
dist_func('Normal', bins=100)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...