Python 如何使用PyPlot绘制带有2个滑块的4D阵列?
我有一个4D数据集(对于那些关心的人来说,这是一个天文位置温度不透明度图像)在一个numpy数组中,我需要以交互方式绘制。虽然有一些程序可以做到这一点,但它们都无法处理我的数据所采用的异常形式(但我可以担心,这不是问题的一部分) 我知道如何使用一个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
滑块绘制图像,但实际上我需要使用两个滑块绘制图像,温度和不透明度各一个
我的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
函数。我想我需要声明aT_轴=2
和B_轴=3
,而不是简单地声明aT_轴=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语句树来实现它,但我不确定它是否就是这样做的。我正要发布我找到了一种方法,但是你的方法更优雅,更容易理解。