I have 3 dimensional data say (5,100,100). Now I would like to see them slice by slice upon hitting the down arrow button.
I have 3 dimensional data say (5,100,100). Now I would like to see them slice by slice upon hitting the down arrow button.
I adapted the code from an answer I gave to this question a couple of weeks ago to include keystrokes. The left key will scroll backwards, the right key will scroll forwards.
import matplotlib.widgets
import matplotlib.patches
import mpl_toolkits.axes_grid1class 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 = numpagesself.fig = ax.figuresuper(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.facecolorr = 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:returnself._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+1if (i < self.valmin) or (i >= self.valmax):returnself.set_val(i)self._colorize(i)def backward(self, event):current_i = int(self.val)i = current_i-1if (i < self.valmin) or (i >= self.valmax):returnself.set_val(i)self._colorize(i)# define keyevent, left: backwards, right: forwardsdef keyevent(self, event):#print event.keyif event.key == 'right':self.forward(event)if event.key == 'left':self.backward(event)self.fig.canvas.draw()if __name__ == "__main__":import numpy as npfrom matplotlib import pyplot as pltnum_pages = 5data = 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()