使用滑块打印时出错(python matplotlib)

使用滑块打印时出错(python matplotlib),python,matplotlib,plot,Python,Matplotlib,Plot,我在互联网上搜索如何使用带有3D数据的滑块,并找到哪些使用滑块在2D中绘制3D数据,因此我复制粘贴它,并尝试运行它以适应它(用于解决:绘制3D+时间数据并使用滑块与时间交互)。 这是我的完整代码: import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Slider, Button, RadioButtons import scipy.ndimage as ndi data = np.z

我在互联网上搜索如何使用带有3D数据的滑块,并找到哪些使用滑块在2D中绘制3D数据,因此我复制粘贴它,并尝试运行它以适应它(用于解决:绘制3D+时间数据并使用滑块与时间交互)。 这是我的完整代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
import scipy.ndimage as ndi

data = np.zeros((10, 10, 10))
data[5, 5, 5] = 10.
data = ndi.filters.gaussian_filter(data, sigma=1)
print(data.max())

def cube_show_slider(cube, axis=0, **kwargs):
    """
    Display a 3d ndarray with a slider to move along the third dimension.
    Extra keyword arguments are passed to imshow
    """
    # check dim
    if not cube.ndim == 3:
        raise ValueError("cube should be an ndarray with ndim == 3")
    # generate figure
    fig = plt.figure()
    ax = plt.subplot(111)
    fig.subplots_adjust(left=0.25, bottom=0.25)
    # select first image
    s = [slice(0, 1) if i == axis else slice(None) for i in range(3)]
    im = cube[s].squeeze()
    # display image
    l = ax.matshow(im, **kwargs)
    cb = plt.colorbar(l)
    cb.set_clim(vmin=data.min(), vmax=data.max())
    cb.draw_all()
    # define slider
    axcolor = 'lightgoldenrodyellow'
    ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
    slideryo = Slider(ax, 'Axis %i index' % axis, 0, cube.shape[axis] - 1, valinit=0, valfmt='%i')
    slideryo.on_changed(update)
    plt.show()

def update(val):
    ind = int(slider.val)
    s = [slice(ind, ind + 1) if i == axis else slice(None) for i in    range(3)]
    im = cube[s].squeeze()
    l.set_data(im, **kwargs)
    cb.set_clim(vmin=data.min(), vmax=data.max())
    cb.formatter.set_powerlimits((0, 0))
    cb.update_ticks()
    cb.draw_all()
    fig.canvas.draw()

cube_show_slider(data)
屏幕上有一个带有轴和滑块的窗口,但没有打印数据。绘图只是一个蓝色的大正方形,当我与滑块交互时,我会出现以下错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 1952, in motion_notify_event
      self.callbacks.process(s, event)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/cbook.py", line 563, in process
      proxy(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/cbook.py", line 430, in __call__
      return mtd(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/widgets.py", line 434, in _update
      self.set_val(val)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/widgets.py", line 448, in set_val
      func(val)
  File "<stdin>", line 2, in update
      NameError: global name 'slider' is not defined
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
        File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 1541, in plot
lines = Axes.plot(self, xs, ys, *args[argsi:], **kwargs)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py", line 1812, in inner
    return func(ax, *args, **kwargs)
        File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 1424, in plot
for line in self._get_lines(*args, **kwargs):
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 386, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
        File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 339, in _plot_args
raise ValueError('third arg must be a format string')
    ValueError: third arg must be a format string
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_axes.py:519: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.
    warnings.warn("No labelled objects found. ")
但它返回以下错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 1952, in motion_notify_event
      self.callbacks.process(s, event)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/cbook.py", line 563, in process
      proxy(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/cbook.py", line 430, in __call__
      return mtd(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/widgets.py", line 434, in _update
      self.set_val(val)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/widgets.py", line 448, in set_val
      func(val)
  File "<stdin>", line 2, in update
      NameError: global name 'slider' is not defined
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
        File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 1541, in plot
lines = Axes.plot(self, xs, ys, *args[argsi:], **kwargs)
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py", line 1812, in inner
    return func(ax, *args, **kwargs)
        File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_axes.py", line 1424, in plot
for line in self._get_lines(*args, **kwargs):
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 386, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
        File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_base.py", line 339, in _plot_args
raise ValueError('third arg must be a format string')
    ValueError: third arg must be a format string
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_axes.py:519: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.
    warnings.warn("No labelled objects found. ")
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/mpl_toolkit/mplot3d/axes3d.py”,第1541行,在绘图中
线=轴。绘图(self、xs、ys、*args[argsi:]、**kwargs)
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/matplotlib/__init__.py”,第1812行,内部
返回函数(ax,*args,**kwargs)
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/matplotlib/axes/_axes.py”,第1424行,在绘图中
对于自身中的行。获取行(*args,**kwargs):
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/matplotlib/axes/_base.py”,第386行,在_grab_next_args中
对于seg in self.\u plot\u args(剩余,kwargs):
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/matplotlib/axes/_base.py”,第339行,在_plot_args中
raise VALUERROR('第三个参数必须是格式字符串')
ValueError:第三个参数必须是格式字符串
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/matplotlib/axes/_axes.py:519:UserWarning:未找到带标签的对象。在单个绘图上使用label='…'kwarg。
warnings.warn(“未找到带标签的对象”)

我能做什么?

我已经更正了您的代码,您有一些错误,您可以通过比较发现:

  • update函数需要在子程序中定义,以便在子程序中可以访问,否则将出错
  • 滑块在不同位置有两个不同的名称
  • 仅在定义函数后,才可参考更新函数
希望它现在起作用

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
import scipy.ndimage as ndi

data = np.zeros((10, 10, 10))
data[5, 5, 5] = 10.
data = ndi.filters.gaussian_filter(data, sigma=1)
print(data.max())
print data.shape

def cube_show_slider(cube, axis=0, **kwargs):
    """
    Display a 3d ndarray with a slider to move along the third dimension.
    Extra keyword arguments are passed to imshow
    """
    # check dim
    if not cube.ndim == 3:
        raise ValueError("cube should be an ndarray with ndim == 3")

    # generate figure
    fig = plt.figure()
    ax = plt.subplot(111)
    fig.subplots_adjust(left=0.25, bottom=0.25)

    # select first image
    s = [slice(0, 1) if i == axis else slice(None) for i in range(3)]
    im = cube[s].squeeze()

    # display image
    l = ax.matshow(im, **kwargs)
    cb = plt.colorbar(l)
    cb.set_clim(vmin=data.min(), vmax=data.max())
    cb.draw_all()

    # define slider
    axcolor = 'lightgoldenrodyellow'
    ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
    slideryo = Slider(ax, 'Axis %i index' % axis, 0, cube.shape[axis] - 1, valinit=0, valfmt='%i')

    def update(val):
        ind = int(slideryo.val)
        s = [slice(ind, ind + 1) if i == axis else slice(None) for i in    range(3)]
        im = cube[s].squeeze()
        l.set_data(im, **kwargs)
        cb.set_clim(vmin=data.min(), vmax=data.max())
        cb.formatter.set_powerlimits((0, 0))
        cb.update_ticks()
        cb.draw_all()
        fig.canvas.draw()

    slideryo.on_changed(update)
    plt.show()


cube_show_slider(data)

我已经更正了您的代码,您有一些错误,您可以通过比较发现:

  • update函数需要在子程序中定义,以便在子程序中可以访问,否则将出错
  • 滑块在不同位置有两个不同的名称
  • 仅在定义函数后,才可参考更新函数
希望它现在起作用

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons
import scipy.ndimage as ndi

data = np.zeros((10, 10, 10))
data[5, 5, 5] = 10.
data = ndi.filters.gaussian_filter(data, sigma=1)
print(data.max())
print data.shape

def cube_show_slider(cube, axis=0, **kwargs):
    """
    Display a 3d ndarray with a slider to move along the third dimension.
    Extra keyword arguments are passed to imshow
    """
    # check dim
    if not cube.ndim == 3:
        raise ValueError("cube should be an ndarray with ndim == 3")

    # generate figure
    fig = plt.figure()
    ax = plt.subplot(111)
    fig.subplots_adjust(left=0.25, bottom=0.25)

    # select first image
    s = [slice(0, 1) if i == axis else slice(None) for i in range(3)]
    im = cube[s].squeeze()

    # display image
    l = ax.matshow(im, **kwargs)
    cb = plt.colorbar(l)
    cb.set_clim(vmin=data.min(), vmax=data.max())
    cb.draw_all()

    # define slider
    axcolor = 'lightgoldenrodyellow'
    ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor)
    slideryo = Slider(ax, 'Axis %i index' % axis, 0, cube.shape[axis] - 1, valinit=0, valfmt='%i')

    def update(val):
        ind = int(slideryo.val)
        s = [slice(ind, ind + 1) if i == axis else slice(None) for i in    range(3)]
        im = cube[s].squeeze()
        l.set_data(im, **kwargs)
        cb.set_clim(vmin=data.min(), vmax=data.max())
        cb.formatter.set_powerlimits((0, 0))
        cb.update_ticks()
        cb.draw_all()
        fig.canvas.draw()

    slideryo.on_changed(update)
    plt.show()


cube_show_slider(data)

谢谢,它很管用!但是现在如果你能回答,我会利用这个机会。我想知道:我问题第二部分的错误是什么?(关于3D绘图)是这一行吗
ax.plot(数据[0,:,:],数据[1,:,:],数据[2,:,:],label='my data')
?谢谢,它可以工作!但是现在如果你能回答,我会利用这个机会。我想知道:我问题第二部分的错误是什么?(关于3D绘图)是这一行吗
ax.plot(数据[0,:,:],数据[1,:,:],数据[2,:,:],label='my data')