在matplotlib中通过一组2D热图分页/滚动

我正在生成一组3D数据的2D热图图。 我希望能够有一个机制来交互式地浏览每个窗格。 下面是一个简单的示例代码,我希望能够通过滑动条(或其他方式)交互式地查看两个窗格(即z = [0,1])。 这是可能的matplotlib或这是我需要在生成图像文件后进行后处理?

import numpy as np from matplotlib import pyplot as plt data = np.random.randint(10, size=(5, 5, 2)) data_slice = np.zeros((5,5)) for i in range(0, 5): for j in range(0, 5): data_slice[i][j] = data[i][j][0] plt.imshow(data_slice, cmap='hot', interpolation='nearest') plt.show() 

编辑:我希望能够做到这一点互动 ,似乎可能的重复正试图做到这一点自动。

您可以根据Andrew的评论build议对图层进行animation处理,也可以使用滑块手动遍历图层,如下所示:

 import numpy as np from matplotlib import pyplot as plt from matplotlib.widgets import Slider # generate a five layer data data = np.random.randint(10, size=(5, 5, 5)) # current layer index start with the first layer idx = 0 # figure axis setup fig, ax = plt.subplots() fig.subplots_adjust(bottom=0.15) # display initial image im_h = ax.imshow(data[:, :, idx], cmap='hot', interpolation='nearest') # setup a slider axis and the Slider ax_depth = plt.axes([0.23, 0.02, 0.56, 0.04]) slider_depth = Slider(ax_depth, 'depth', 0, data.shape[2]-1, valinit=idx) # update the figure with a change on the slider def update_depth(val): idx = int(round(slider_depth.val)) im_h.set_data(data[:, :, idx]) slider_depth.on_changed(update_depth) plt.show() 

滑块是继续而层索引是离散的整数,我希望这不是一个问题。 这是由此产生的数字,

在这里输入图像描述

解决scheme的确可以使用滑块@hashmuke的优秀答案。 在他的回答中他提到: “滑块是连续的,而层索引是一个离散的整数”

这让我想到一个解决scheme,不会有这个限制,并有
更像页面的外观和感觉

结果是PageSlider 。 子类Slider使用滑块function,但以从1开始的整数步骤显示滑块。 它将页面的numpages作为init参数,但除了从外部看到的Slider外。 此外,它还提供了一个后退和前进button。

一个类似于@hashmuke的例子在类下面给出。

 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 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) 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) if __name__ == "__main__": import numpy as np from matplotlib import pyplot as plt num_pages = 23 data = np.random.rand(9, 9, num_pages) 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() 

在这里输入图像描述