Python 在Matplotlib中查看三维Numpy数组并从键盘或鼠标获取参数

Python 在Matplotlib中查看三维Numpy数组并从键盘或鼠标获取参数,python,user-interface,matplotlib,Python,User Interface,Matplotlib,我有三维数据,比如(5100100)。现在,我希望在按下向下箭头按钮时看到它们一片一片地出现。我修改了几周前的代码,以包含击键。 左键将向后滚动,右键将向前滚动 import matplotlib.widgets import matplotlib.patches import mpl_toolkits.axes_grid1 class PageSlider(matplotlib.widgets.Slider): def __init__(self, ax, label, numpa

我有三维数据,比如(5100100)。现在,我希望在按下向下箭头按钮时看到它们一片一片地出现。

我修改了几周前的代码,以包含击键。 左键将向后滚动,右键将向前滚动

import matplotlib.widgets
import matplotlib.patches
import mpl_toolkits.axes_grid1

class PageSlider(matplotlib.widgets.Slider):

    def __init__(self, ax, label, numpages = 10, valinit=0, valfmt='%1d', 
                 closedmin=True, closedmax=True,  
                 dragging=True, **kwargs):

        self.facecolor=kwargs.get('facecolor',"w")
        self.activecolor = kwargs.pop('activecolor',"b")
        self.fontsize = kwargs.pop('fontsize', 10)
        self.numpages = numpages
        self.fig = ax.figure

        super(PageSlider, self).__init__(ax, label, 0, numpages, 
                            valinit=valinit, valfmt=valfmt, **kwargs)

        self.poly.set_visible(False)
        self.vline.set_visible(False)
        self.pageRects = []
        for i in range(numpages):
            facecolor = self.activecolor if i==valinit else self.facecolor
            r  = matplotlib.patches.Rectangle((float(i)/numpages, 0), 1./numpages, 1, 
                                transform=ax.transAxes, facecolor=facecolor)
            ax.add_artist(r)
            self.pageRects.append(r)
            ax.text(float(i)/numpages+0.5/numpages, 0.5, str(i+1),  
                    ha="center", va="center", transform=ax.transAxes,
                    fontsize=self.fontsize)
        self.valtext.set_visible(False)

        divider = mpl_toolkits.axes_grid1.make_axes_locatable(ax)
        bax = divider.append_axes("right", size="5%", pad=0.05)
        fax = divider.append_axes("right", size="5%", pad=0.05)
        self.button_back = matplotlib.widgets.Button(bax, label=ur'$\u25C0$', 
                        color=self.facecolor, hovercolor=self.activecolor)
        self.button_forward = matplotlib.widgets.Button(fax, label=ur'$\u25B6$', 
                        color=self.facecolor, hovercolor=self.activecolor)
        self.button_back.label.set_fontsize(self.fontsize)
        self.button_forward.label.set_fontsize(self.fontsize)
        self.button_back.on_clicked(self.backward)
        self.button_forward.on_clicked(self.forward)
        #connect keys:
        self.fig.canvas.mpl_connect('key_press_event', self.keyevent)


    def _update(self, event):
        super(PageSlider, self)._update(event)
        i = int(self.val)
        if i >=self.valmax:
            return
        self._colorize(i)

    def _colorize(self, i):
        for j in range(self.numpages):
            self.pageRects[j].set_facecolor(self.facecolor)
        self.pageRects[i].set_facecolor(self.activecolor)

    def forward(self, event):
        current_i = int(self.val)
        i = current_i+1
        if (i < self.valmin) or (i >= self.valmax):
            return
        self.set_val(i)
        self._colorize(i)

    def backward(self, event):
        current_i = int(self.val)
        i = current_i-1
        if (i < self.valmin) or (i >= self.valmax):
            return
        self.set_val(i)
        self._colorize(i)

    # define keyevent, left: backwards, right: forwards
    def keyevent(self, event):
        #print event.key
        if event.key == 'right':
            self.forward(event)
        if event.key == 'left':
            self.backward(event)
        self.fig.canvas.draw()


if __name__ == "__main__":
    import numpy as np
    from matplotlib import pyplot as plt


    num_pages = 5
    data = np.random.rand(num_pages, 100, 100)

    fig, ax = plt.subplots()
    fig.subplots_adjust(bottom=0.18)

    im = ax.imshow(data[0, :, :], cmap='viridis', interpolation='nearest')

    ax_slider = fig.add_axes([0.1, 0.05, 0.8, 0.04])
    slider = PageSlider(ax_slider, 'Page', num_pages, activecolor="orange")

    def update(val):
        i = int(slider.val)
        im.set_data(data[i, :,:])

    slider.on_changed(update)

    plt.show()
import matplotlib.widgets
导入matplotlib.patches
导入mpl\u工具包。轴\u网格1
类PageSlider(matplotlib.widgets.Slider):
定义初始值(self,ax,label,numpages=10,valinit=0,valfmt='%1d',
closedmin=True,closedmax=True,
拖动=真,**kwargs):
self.facecolor=kwargs.get('facecolor','w')
self.activecolor=kwargs.pop('activecolor','b')
self.fontsize=kwargs.pop('fontsize',10)
self.numpages=numpages
self.fig=ax.figure
超级(页面滑块,自我)。\uuuu初始化\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
valinit=valinit,valfmt=valfmt,**kwargs)
self.poly.set_可见(False)
self.vline.set_可见(假)
self.pageRects=[]
对于范围内的i(单位):
如果i==valinit else self.facecolor,则facecolor=self.activecolor
r=matplotlib.patches.Rectangle((float(i)/numpages,0),1./numpages,1,
transform=ax.transAxes,facecolor=facecolor)
ax.添加艺术家(r)
self.pageRects.append(r)
最大文本(浮点(i)/numpages+0.5/numpages,0.5,str(i+1),
ha=“center”,va=“center”,transform=ax.transAxes,
fontsize=self.fontsize)
self.valtext.set_可见(False)
分割器=mpl\U工具包。轴网格1。使轴可定位(ax)
bax=分隔器。附加_轴(“右”,size=“5%”,pad=0.05)
传真=分隔器。附加_轴(“右”,size=“5%”,pad=0.05)
self.button\u back=matplotlib.widgets.button(bax,label=ur'$\u25C0$',
color=self.facecolor,hovercolor=self.activecolor)
self.button_forward=matplotlib.widgets.button(传真,标签=ur'$\u25B6$',
color=self.facecolor,hovercolor=self.activecolor)
self.button_back.label.set_fontsize(self.fontsize)
self.button_forward.label.set_fontsize(self.fontsize)
self.button\u back.单击时(self.backward)
self.button\u forward.单击时(self.forward)
#连接密钥:
self.fig.canvas.mpl\u connect('key\u press\u event',self.keyevent)
def_更新(自身、事件):
超级(页面滑块,自我)。\u更新(事件)
i=int(self.val)
如果i>=self.valmax:
返回
自着色(i)
def_着色(自我,i):
对于范围内的j(自身数值):
self.pageRects[j].设置_facecolor(self.facecolor)
self.pageRects[i].set_facecolor(self.activecolor)
def转发(自身、事件):
当前_i=int(self.val)
i=当前_i+1
如果(i=self.valmax):
返回
自我设定值(一)
自着色(i)
def向后(自身、事件):
当前_i=int(self.val)
i=电流_i-1
如果(i=self.valmax):
返回
自我设定值(一)
自着色(i)
#定义keyevent,左:向后,右:向前
def keyevent(自我,事件):
#打印事件.key
如果event.key=='right':
自我转发(事件)
如果event.key==“left”:
自后退(事件)
self.fig.canvas.draw()
如果名称=“\uuuuu main\uuuuuuuu”:
将numpy作为np导入
从matplotlib导入pyplot作为plt
页数=5
data=np.random.rand(num_pages,100100)
图,ax=plt.子批次()
图子批次调整(底部=0.18)
im=ax.imshow(数据[0,:,:],cmap='viridis',插值='nearest')
ax_滑块=图添加_轴([0.1,0.05,0.8,0.04])
slider=pagesslider(ax\u滑块,“Page”,num\u页面,activecolor=“orange”)
def更新(val):
i=int(slider.val)
im.set_数据(数据[i,:,:])
滑块。on_已更改(更新)
plt.show()

到目前为止,您可以展示您的努力。例如,首先以一种有意义的方式绘制数组的一个切片,比如一个,然后进行一些绘制。然后告诉我们你的努力出了什么问题,或者什么没有按你期望的方式发挥作用。