使用for循环为plt.plot更改标题并创建6x16子图

4
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个图表。
1个回答

6
在您的for循环中,每次创建一个新的图形,这就是为什么您会得到96个图形。我没有您的数据,因此无法提供最终的图形,但以下方法应适用于您:
  • 定义一个包含6x16子图的图和axes数组。
  • 使用enumerateaxes.flatten上迭代子图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次。我尝试使用两个循环,但也不起作用。 - Michelle Hernandez
enumerate(axes.flatten()): 返回两个东西:第一个是从0开始的索引,第二个是每个子图中实际轴对象,通过for循环逐一返回。 - Sheldore
如果你有6行16列,那么这个for循环确实会运行96次。变量i的值将从0到95。为了验证,你可以在for循环内添加print(i),它将打印0、1、2、……、94、95。 - Sheldore
这段代码现在可以运行,但子图都重叠在一起,看起来像一团乱麻。我尝试将其更改为32行和3列,并添加plt.tight_layout(),但两者都没有起作用。 - Michelle Hernandez
另外,如果将plt.show()放在for循环之外,它只会显示一个巨大的图。 - Michelle Hernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接