【问题标题】:Use slider to choose which graph to show使用滑块选择要显示的图表
【发布时间】:2021-10-14 06:11:36
【问题描述】:

假设我想通过读取三个 .xlsx 文件来显示三个模拟。 接下来,我想设计一个滑块来选择要显示的模拟。 如果我将滑块移动到 0,那么 0 将是函数“update()”的输入。将显示第一个模拟。

以下是代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.widgets import Slider
import pandas as pd
import ipywidgets as wg

# input files

rm = pd.read_excel("test_3d.xlsx", header = None)
rm1 = pd.read_excel("test_3d1.xlsx", header = None)
rm2 = pd.read_excel("test_3d2.xlsx", header = None)
rec = np.shape(rm)
X = np.arange(1,rec[1]+1,1)
Y = np.arange(1,rec[0]+1,1)
x , y = np.meshgrid(X,Y)


# Set 3D plots

fig = plt.figure()
ax1 = fig.add_axes([0, 0, 1, 0.8], projection = '3d')


# Choose which 3D plots to show

def update(val):
    if val == 0:
        ax1.cla()
        ax1.plot_surface(x, y, rm, cmap = cm.coolwarm, linewidth = 0, antialiased = False)        
    elif val == 1:
        ax1.cla()
        ax1.plot_surface(x, y, rm1, cmap = cm.coolwarm, linewidth = 0, antialiased = False)
    elif val == 2:
        ax1.cla()
        ax1.plot_surface(x, y, rm2, cmap = cm.coolwarm, linewidth = 0, antialiased = False)      
    
ax1.set_zlim(-110, -80)

# Design a slider to choose which simulation to show 

slider = wg.IntSlider(value=1, min=0, max=2, description='this is slider')
slideroutput = wg.Output()
display(slider, slideroutput)


numberonslider = []
def on_value_change(change):

    with slideroutput:
        numberonslider.append(change['new'])
        print(numberonslider[-1])
    
    
ddd = slider.observe(on_value_change, names='value')
update(ddd)

如果我移动滑块,“ddd”会给你一个 0、1 或 2 的列表。

但是,3D 模拟没有出现。如何修改代码?

【问题讨论】:

  • 您的 IDE 是否允许您拥有 matplotlib 动画?例如 Jupyter 需要 %matplotlib widget%matplotlib inline 导入才能工作
  • @Karina 是的,我刚刚修改了我的代码。

标签: python matplotlib 3d slider


【解决方案1】:

我正在使用 JupyterLab。对于任何类型的交互式 matplotlib 图,我都需要 %matplotlib widget。下面的代码可以正常工作,但没有%matplotlib widget 将无法工作。

警告:%matplotlib widget 不一样 import matplotlib.widget

你没有提供任何样本数据,所以我只是做了一些数据。基本上你的代码结构不正确,if 部分应该在def on_value_change(change): 内。请看下面的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
import ipywidgets as wg
%matplotlib widget

X = np.arange(5)
Y = np.arange(5)
x, y = np.meshgrid(X, Y)
rm = np.sin(x)
rm1 = np.cos(x)
rm2 = y

fig = plt.figure()
ax1 = fig.add_axes([0, 0, 1, 0.8], projection = '3d')

# Design a slider to choose which simulation to show 
slider = wg.IntSlider(value=1, min=0, max=2, description='this is slider')
slideroutput = wg.Output()
display(slider, slideroutput)

ax1.cla()
plt.title(f"This is slider number {str(slider.value)}")
ax1.plot_surface(x, y, rm1, cmap = cm.coolwarm, linewidth = 10, antialiased = False)

numberonslider = []
def on_value_change(change):
    with slideroutput:
        numberonslider.append(change['new'])
        if numberonslider[-1] == 0:
            ax1.cla()
            plt.title(f"This is slider number {str(slider.value)}")
            ax1.plot_surface(x, y, rm, cmap = cm.coolwarm, linewidth = 10, antialiased = False)
        elif numberonslider[-1] == 1:
            ax1.cla()
            plt.title(f"This is slider number {str(slider.value)}")
            ax1.plot_surface(x, y, rm1, cmap = cm.coolwarm, linewidth = 10, antialiased = False)
        elif numberonslider[-1] == 2:
            ax1.cla()
            plt.title(f"This is slider number {str(slider.value)}")
            ax1.plot_surface(x, y, rm2, cmap = cm.coolwarm, linewidth = 10, antialiased = False)
    
slider.observe(on_value_change, names='value')

输出:

如果我的解释不清楚,请再次询问。

【讨论】:

  • 谢谢!我刚刚运行了你的代码;但是,它没有显示任何图形,而是显示以下(我使用 JupyterLab)“ Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back ', '回到上一个 ... IntSlider(value=1, description='this is slider', max=2) Output()"。如何解决这个问题?再次感谢!
  • 您可以尝试绘制任何图表并截取它并发布在您的问题中吗?我只是想看看matplotlib交互式安装是否完成(它必须像我的截图一样有侧边菜单)。只需绘制任何随机图,plt.scatter(np.arange(5), np.arange(5)) 就足够了。我有点知道为什么它在你的 JupyterLab 中不起作用,但我只是想先确定一下,然后再给你任何进一步的说明。
  • 非常感谢!现在可以了。但看起来它不必在 JupyterLab 环境中; Jupyter Notebook 工作正常!
  • 问题出在哪里? matplotlib 小部件?是的,基本上适用于 JupyterLab 的东西也适用于 Jupyter Notebook(大部分情况下)。
  • 不确定问题出在哪里。我想问题可能来自我当时刚刚安装了与 %matplotlib 小部件相关的文件。现在,重新打开电脑就可以了。
猜你喜欢
  • 2018-11-27
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多