在 plt.plot 的 for 循环中更改标题并创建 6x16 子图

Mic*_*dez 4 python for-loop matplotlib subplot

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()

Run Code Online (Sandbox Code Playgroud)

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

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

She*_*ore 5

您每次在 for 循环中都会创建一个新图形,这就是为什么您会得到 96 个图形。我没有你的数据,所以我不能提供最终数字,但以下应该适合你。这里的想法是:

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

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()
Run Code Online (Sandbox Code Playgroud)