【问题标题】:Python Using pyplot slider with subplotsPython 使用带有子图的 pyplot 滑块
【发布时间】:2015-07-06 13:51:28
【问题描述】:

我对 Python 很陌生,所以如果这是一个愚蠢的初学者错误,请原谅。但是,我已经为此苦苦挣扎了一段时间。 我想创建一个带有 n x m 个子图的图形,每个子图都是形状为 [1024,264,264] 的 np.array。当我正在寻找堆栈中沿 0 维发生的差异时,我想使用滑块同时探索我图中的所有堆栈。 滑块实例适用于具有一个子图的图形,但我无法将它们全部用于工作。 这就是我正在使用的代码:

import os
from matplotlib import pyplot as plt
import numpy as np

import glob
import h5py
#Define the xy size of the mapped array
xsize=3
ysize=3

lengthh5=9
readlist=[]
for i in range (0,lengthh5):
    npraw=np.random.rand(200,50,50)
    readlist.append (npraw)

''' Slider visualization'''
from matplotlib.widgets import Slider
fig=plt.figure()
for k in range (0,lengthh5):
    ax=fig.add_subplot(xsize,ysize,k)        
    frame = 10
    l = ax.imshow(readlist[k][frame,:,:]) 
    plt.axis('off')
           sframe = Slider(fig.add_subplot(50,1,50), 'Frame', 0, len(readlist[0])-1, valinit=0)
    def update(val):
        frame = np.around(sframe.val)
        l.set_data(readlist[k][frame,:,:])


sframe.on_changed(update)

plt.show()

对于这种特殊情况,我将其剥离为一个 3x3 数组以用于我的图,并只创建随机(较小)数组。 有趣的是,滑块只能在倒数第二个子图上操作。但是,我不知道如何将它同时链接到所有子图。也许有人知道如何做到这一点。 提前非常感谢,

蒂尔曼

【问题讨论】:

    标签: python matplotlib slider matplotlib-widget


    【解决方案1】:

    您需要将每个imshow AxesImage 存储在一个列表中并在更新内部,遍历所有这些并根据滑块更新每个,

    import os
    from matplotlib import pyplot as plt
    from matplotlib.widgets import Slider
    import numpy as np
    
    import glob
    import h5py
    #Define the xy size of the mapped array
    xsize=3
    ysize=3
    
    lengthh5=9
    readlist=[]
    for i in range (0,lengthh5):
        npraw=np.random.rand(200,50,50)
        readlist.append (npraw)
    
    fig=plt.figure()
    ls = []
    for k in range (0,lengthh5):
        ax=fig.add_subplot(xsize,ysize,k)        
        frame = 10
        l = ax.imshow(readlist[k][frame,:,:]) 
        ls.append(l)
        plt.axis('off')
    
    sframe = Slider(fig.add_subplot(50,1,50), 'Frame', 
                    0, len(readlist[0])-1, valinit=0)
    
    def update(val):
        frame = np.around(sframe.val)
        for k, l in enumerate(ls):
            l.set_data(readlist[k][frame,:,:])
    
    sframe.on_changed(update)
    plt.show()
    

    【讨论】:

    • 效果很好。非常感谢您的快速帮助
    • 抱歉过早地接受了答案。我使用了比随机数据提供更多“特征”的实际数据。现在看来,当我移动滑块时,我正在将数组的第 8 个图像插入到所有 9 个图像中。形象正在改变,但它只是八分之一。我猜它与更新中 l for 循环中的 k 有关,但我现在没有解决方案。
    • 是的,抱歉,我错过了阅读列表中的 k 索引,该索引也应该随轴号而变化(上面使用枚举更改)。
    • @EdSmith 您添加了k 滑块,如果您只是更改sframe = Slider(fig.add_subplot(50,1+k,50),...,您会注意到这一点,所以最后您正在使用最后一个绘制的滑块。如果您只是删除该行之前的意图,它可以正常工作。
    • @philippos,打算吗?我假设您的意思是缩进,好地方,我已经调整了示例。
    猜你喜欢
    • 2023-04-04
    • 2013-12-26
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多