python - 使用 matplotlib Slider 创建具有不同非等距参数的交互式绘图

标签 python matplotlib plot

我一直在处理一组具有 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/

相关文章:

python - "Not implemented"使用pywin32控制Adobe Acrobat时出现异常

python - 我有一个在 python 空闲中完美运行的代码,但它没有在终端中正确运行

python - 如何使用 plt.figure 和 add_subplot 放大seaborn箱线图?

python - 使用 PCA 特征作为 X 和 Y 轴绘制集群

python - python中散点图的最佳拟合直线的代码

python - 在 python 中绘制,在键盘点击时更新

python - 是否可以在defaultdict中调用迭代器来获取下一个键值?

python - django 模板能否找到其命名的 url,或者基本模板能否知道哪个模板正在扩展它?

python - 绘图中的彩色 LaTeX 标签

python - hexbin 和 histogram2d 的不同行为