Python 如何使用PyPlot绘制带有2个滑块的4D阵列?

Python 如何使用PyPlot绘制带有2个滑块的4D阵列?,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一个4D数据集(对于那些关心的人来说,这是一个天文位置温度不透明度图像)在一个numpy数组中,我需要以交互方式绘制。虽然有一些程序可以做到这一点,但它们都无法处理我的数据所采用的异常形式(但我可以担心,这不是问题的一部分) 我知道如何使用一个滑块绘制图像,但实际上我需要使用两个滑块绘制图像,温度和不透明度各一个 我的3D阵列代码MWE如下: import matplotlib.pyplot as plt from matplotlib.widgets import Slider impor

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

我知道如何使用一个
滑块绘制图像,但实际上我需要使用两个
滑块绘制图像,温度和不透明度各一个

我的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个滑块。尤其是如何适应这条线

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

以及如何在我从
np.random.rand(300300,10)
转到
np.random.rand(300300,10,10)
时修改
update
函数。我想我需要声明a
T_轴=2
B_轴=3
,而不是简单地声明a
T_轴=2
,但除此之外,我还很想知道如何修改它

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

您现在当然需要两个不同的silder,其中一个确定
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()

我不明白这个问题。如果要有两个滑块,请使用两个滑块。如果你遇到问题,我们需要一个真正的问题,而不是一个“几乎”的问题。我已经更新了一段完全可以工作的代码,并且更好地概述了我的问题。也许我读得太多了,根本不知道如何修改
s=
行。它看起来像一个列表,我想它是一个列表。所以我可以用一个更扩展的for循环和if,elif,else语句树来实现它,但我不确定它是否就是这样做的。我正要发布我找到了一种方法,但是你的方法更优雅,更容易理解。