matplotlib 子图的行标题

新手上路,请多包涵

在 matplotlib 中,除了为整个图设置标题和为每个单独图设置标题之外,是否可以为每一行子图设置单独的标题?这将对应于下图中的橙色文本。在此处输入图像描述

如果没有,您将如何解决这个问题?在左侧创建一个单独的空子图列并用橙色文本填充它们?

我知道可以使用 text()annotate() 手动定位每个标题,但这通常需要大量调整,而且我有很多子图。有更流畅的解决方案吗?

原文由 joelostblom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

matplotlib 3.4.0 中的新功能

行标题现在可以实现为 子图字幕

新的子图功能允许在具有 仅属于每个 子图的本地化艺术家(例如,颜色条和 字幕)的图形中创建虚拟图形。

有关详细信息,请参阅 如何绘制子图


如何重现 OP 的参考图:

Create 3x1 fig.subfigures where each subfig gets its own 1x3 subfig.subplots and subfig.suptitle :

   fig = plt.figure(constrained_layout=True)
  fig.suptitle('Figure title')

  # create 3x1 subfigs
  subfigs = fig.subfigures(nrows=3, ncols=1)
  for row, subfig in enumerate(subfigs):
      subfig.suptitle(f'Subfigure title {row}')

      # create 1x3 subplots per subfig
      axs = subfig.subplots(nrows=1, ncols=3)
      for col, ax in enumerate(axs):
          ax.plot()
          ax.set_title(f'Plot title {col}')

如果你已经有 3x1 plt.subplots ,那么 add_subfigure 进入底层 gridspec 。同样,每个 subfig 将获得自己的 1x3 subfig.subplotssubfig.suptitle

   # create 3x1 subplots
  fig, axs = plt.subplots(nrows=3, ncols=1, constrained_layout=True)
  fig.suptitle('Figure title')

  # clear subplots
  for ax in axs:
      ax.remove()

  # add subfigure per subplot
  gridspec = axs[0].get_subplotspec().get_gridspec()
  subfigs = [fig.add_subfigure(gs) for gs in gridspec]

  for row, subfig in enumerate(subfigs):
      subfig.suptitle(f'Subfigure title {row}')

      # create 1x3 subplots per subfig
      axs = subfig.subplots(nrows=1, ncols=3)
      for col, ax in enumerate(axs):
          ax.plot()
          ax.set_title(f'Plot title {col}')


任一示例的输出(经过一些样式设置后):

原文由 tdy 发布,翻译遵循 CC BY-SA 4.0 许可协议

一个想法是创建三个“大子图”,给每个子图一个标题,并使它们不可见。最重要的是,您可以创建较小的子图矩阵。

这个解决方案完全基于 这篇文章,除了更加注意实际删除背景子图。

在此处输入图像描述

 import matplotlib.pyplot as plt

fig, big_axes = plt.subplots( figsize=(15.0, 15.0) , nrows=3, ncols=1, sharey=True)

for row, big_ax in enumerate(big_axes, start=1):
    big_ax.set_title("Subplot row %s \n" % row, fontsize=16)

    # Turn off axis lines and ticks of the big subplot
    # obs alpha is 0 in RGBA string!
    big_ax.tick_params(labelcolor=(1.,1.,1., 0.0), top='off', bottom='off', left='off', right='off')
    # removes the white frame
    big_ax._frameon = False

for i in range(1,10):
    ax = fig.add_subplot(3,3,i)
    ax.set_title('Plot title ' + str(i))

fig.set_facecolor('w')
plt.tight_layout()
plt.show()

原文由 snake_charmer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏