我一直在处理一组具有 4 个输入维度和 1 个输出维度的数据。我想用 2 个固定输入来可视化 3D 数据。同时,我想用 slider 小部件调整 2 个固定输入,以实时查看图形变化。我使用了神经网络,并且拥有所有输出数据,但没有简单的函数来生成输出数据。 (例如,对于 5*5*5*5 的输入大小,我拥有全部 625 个输出数据点)
我一直在考虑使用 slider ,但该小部件似乎使用固定的输入间隔。
下面是 slider 小部件的示例代码。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
delta_f = 5.0
s = a0*np.sin(2*np.pi*f0*t)
l, = plt.plot(t, s, lw=2, color='red')
plt.axis([0, 1, -10, 10])
axcolor = 'lightgoldenrodyellow'
axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0, valstep=delta_f)
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)
def update(val):
amp = samp.val
freq = sfreq.val
l.set_ydata(amp*np.sin(2*np.pi*freq*t))
fig.canvas.draw_idle()
sfreq.on_changed(update)
samp.on_changed(update)
plt.show()
在此示例中,valstep 用于通过 slider 更改值,并且随着频率和幅度的变化,它使用给定函数再次计算相应的输出并显示。但我想对间隔不相等(步长不同)的频率和幅度以及使用给定频率和幅度预先计算的所有输出执行相同的操作。如果我能以某种方式弄清楚如何做到这一点,我可以将其应用到我的工作中,唯一的区别是 3D 绘图。
非常感谢。
最佳答案
您可以传递 slider 返回的值,以计算用作图表参数的新值。
或者,您可以使用 slider 中的值到您要使用的值的映射。
一个(可以说是人为的)示例,其中包含计算和使用 slider 值中的新值的函数:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
import math
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
t = np.arange(0.0, 1.0, 0.001)
a0 = 5
f0 = 3
delta_f = 5.0
s = a0 * np.sin(2 * np.pi * f0 * t)
l, = plt.plot(t, s, lw=2, color='red')
plt.axis([0, 1, -10, 10])
axcolor = 'lightgoldenrodyellow'
axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0) #, valstep=delta_f)
samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)
def get_amp_val(val):
return math.exp(val) # replace with a meaningful transformation of your parameters
def get_freq_val(val):
return math.log(val) # replace with a meaningful transformation of your parameters
def update(val):
amp = get_amp_val(samp.val) # call a transform on the slider value
freq = get_freq_val(sfreq.val) # call a transform on the slider value
l.set_ydata(amp * np.sin(2 * np.pi * freq * t))
fig.canvas.draw_idle()
sfreq.on_changed(update)
samp.on_changed(update)
plt.show()
使用映射:
get_amp_val = {k, v for v, k in zip(values_you_want_to_use, slider_returned_values)}
def update(val):
amp = get_amp_val[samp.val] # retrieves the value mapped to the slider value
...
关于python - 使用 matplotlib Slider 创建具有不同非等距参数的交互式绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51925135/