python - 如何使用 PyPlot 绘制带有 2 个 slider 的 4D 数组?

标签 python numpy matplotlib

我有一个 4D 数据集(对于那些关心的人来说,它是一个天文位置-位置-温度-不透明度图像),位于 numpy 数组中,我需要以交互方式绘制。虽然有程序可以做到这一点,但它们都不能处理我的数据所采用的不寻常形式(但我可以担心这一点,这不是问题的一部分)。

我知道如何使用一个 Slider 来绘制图像,但实际上我需要使用 2 个 Slider 来绘制图像,每个 slider 对应温度和不透明度。

我的 3D 数组代码的 MWE 如下:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import numpy as np

array = np.random.rand(300,300,10)

axis = 2
s = [slice(0, 1) if i == axis else slice(None) for i in xrange(array.ndim)]
im = array[s].squeeze()

fig = plt.figure()
ax = plt.subplot(111)
l = ax.imshow(im, origin = 'lower')
axcolor = 'lightgoldenrodyellow'
ax = fig.add_axes([0.2, 0.95, 0.65, 0.03], axisbg=axcolor)

slider = Slider(ax, 'Temperature', 0, array.shape[axis] - 1,
                    valinit=0, valfmt='%i')

def update(val):
    ind = int(slider.val)
    s = [slice(ind, ind + 1) if i == axis else slice(None)
             for i in xrange(array.ndim)]
    im = array[s].squeeze()
    l.set_data(im)
    fig.canvas.draw()

slider.on_changed(update)

plt.show()

有什么办法可以用 2 个 slider 来做到这一点吗?

编辑:我遇到的问题是我不知道如何扩展到 2 个 slider 。特别是如何适应线路

s = [slice(0, 1) if i == axis else slice(None) for i in xrange(array.ndim)]

以及当我从 np.random.rand(300,300,10) 转到 np.random.rand(300,300, 10,10)。我想我需要声明 T_axis = 2B_axis = 3 而不是简单地声明 axis = 2,但除此之外,我我很困惑如何修改它。

最佳答案

当我解释数据结构时,你有一个形状为 (300,300,n,m) 的数组。 ,其中n是温度数,m是不透明度的数量。显示 i 的图像th 温度和 j因此,不透明度为 array[:,:,i,j]

您现在当然需要两个不同的银币,其中一个银币决定i的值。另一个 j .

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import numpy as np

array = np.random.rand(300,300,10,9)
# assuming you have for each i=Temperature index and j =Opacity index
# an image array(:,:,i,j)

fig, ax = plt.subplots()
l = ax.imshow(array[:,:,0,0], origin = 'lower')

axT = fig.add_axes([0.2, 0.95, 0.65, 0.03])
axO = fig.add_axes([0.2, 0.90, 0.65, 0.03])

sliderT = Slider(axT, 'Temperature', 0, array.shape[2]-1, valinit=0, valfmt='%i')
sliderO = Slider(axO, 'Opacity', 0, array.shape[3]-1, valinit=0, valfmt='%i')

def update(val):
    i = int(sliderT.val)
    j = int(sliderO.val)
    im = array[:,:,i,j]
    l.set_data(im)
    fig.canvas.draw_idle()

sliderT.on_changed(update)
sliderO.on_changed(update)

plt.show()

关于python - 如何使用 PyPlot 绘制带有 2 个 slider 的 4D 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327782/

相关文章:

python - 创建具有不同起始值的升序 numpy 数组

python - 始终在 wcs 轴上显示整个刻度标签

python - 我如何从 django 中的博客和评论中复制?

python - Numpy 矩阵乘以不同的列

python - numpy.where 用于 2+ 个特定值

python - 按 '1' 按钮后缩放停止工作,但仅限于子图中

python - 如何在Python中用时间数据绘制直方图

python - Ironpython和Sqlite

python - 为什么 tkinter 在销毁实例时不释放内存?

python - Keras:修复使用 model.fit 时的 "IndexError: list index out of range"错误