【问题标题】:Change titles in a for loop for plt.plot and create 6x16 subplots在 plt.plot 的 for 循环中更改标题并创建 6x16 子图
【发布时间】:2019-08-02 01:04:54
【问题描述】:
secondHold = np.zeros((96,30))

channel = ['channel' for x in range(96)]


for i in range (96):
    BlankBinsx = bins[blankposition,0:30,i]
    StimBinsx = bins[NonBlankPositions,0:30,i]
    meanx = BlankBinsx.mean(axis=0);
    stimmeanx = StimBinsx.mean(axis=0);
    for j in range(30):
        hold[i][j] = meanx[j];
        secondHold[i][j] = stimmeanx[j];
    plt.subplots(1, 1, sharex='all', sharey='all')
    plt.plot(hold[i], label='stimulus')
    plt.plot(secondHold[i], label='Blank Stimulus')
    plt.title('Channel x')
    plt.xlabel('time (ms)')
    plt.ylabel('Avg Spike Rate')
    plt.legend()
    plt.show()

我正在通过一个 for 循环创建 96 个不同的图,并且我希望它也标记这些图(即,第一个图是 'Channel 1',图两个是 'Channel 2' 等等。我试过 ax.set_title 但是无法弄清楚如何使它与字符串和数字一起使用。

我还希望将图表打印为 6x16 的子图,而不是一列中的 96 个图表。

【问题讨论】:

    标签: python for-loop matplotlib subplot


    【解决方案1】:

    您每次都在 for 循环中创建一个新数字,这就是您获得 96 个数字的原因。我没有您的数据,所以我无法提供最终数字,但以下内容应该适合您。这里的想法是:

    • 定义一个图形和一个包含 6x16 个子图的 axes 数组。
    • axes.flatten 上使用enumerate 以逐行遍历子图ax,并使用i 作为索引来访问数据。
    • 使用字段说明符%d 迭代地标记子图。
    • plt.show() 放在 for 循环之外

    secondHold = np.zeros((96,30))
    channel = ['channel' for x in range(96)]
    
    fig, axes = plt.subplots(nrows=6, ncols=16, sharex='all', sharey='all')
    
    for i, ax in enumerate(axes.flatten()):
        BlankBinsx = bins[blankposition,0:30,i]
        StimBinsx = bins[NonBlankPositions,0:30,i]
        meanx = BlankBinsx.mean(axis=0);
        stimmeanx = StimBinsx.mean(axis=0);
        for j in range(30):
            hold[i][j] = meanx[j];
            secondHold[i][j] = stimmeanx[j];
        ax.plot(hold[i], label='stimulus')
        ax.plot(secondHold[i], label='Blank Stimulus')
        ax.set_title('Channel %d' %i)
        ax.set_xlabel('time (ms)')
        ax.set_ylabel('Avg Spike Rate')
        ax.legend()
    plt.show()
    

    【讨论】:

    • 我尝试过运行它,但我对 enumerate(axes.flatten()): 感到困惑,我需要遍历循环 96 次。我尝试制作两个循环,但也没有用。
    • enumerate(axes.flatten()): 返回两件事:第一,从 0 开始的索引,第二,在 for 循环中一个一个地为每个子图的实际轴对象
    • 如果你有 6 行 16 列,那么这个 for 循环确实会运行 96 次。 i 的值将从 0 变为 95。为了说服自己,您可以在 for 循环中添加 print (i),它将打印 0, 1, 2, .... , 94, 95
    • @MichelleHernandez:如果您的问题已经解决,您应该通过单击灰色复选标记将答案标记为已接受。这就是堆栈溢出的工作方式。由于您似乎是 Stack Overflow 的新手,您应该阅读What should I do when someone answers my question?
    • 这段代码现在可以工作了,但是子图都是重叠的,所以看起来像一团糟。我尝试将其更改为 32 行和 3 列并添加 plt.tight_layout() 但这些都不起作用
    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 2021-09-02
    • 2019-06-05
    • 2023-03-26
    • 2019-01-31
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多