gpt4 book ai didi

python - 跨越两个(或任意数量的)子图列的 Matplotlib 标题

转载 作者:太空狗 更新时间:2023-10-29 20:22:30 27 4
gpt4 key购买 nike

由于我正在绘制的内容的性质,我想要类似于嵌套表格的子图。我不确定如何清楚地提出问题,所以我将添加一些图片来代替,希望能说明问题。

我有什么:

Matplotlib graphs with title and axes titles

我想要的:

Matplotlib graphs with title and axes titles AND wanted sub-titles

当前(缩短的)代码看起来像这样:

fig, axes = plt.subplots(nrows=5, ncols=4) 
fig.suptitle(title, fontsize='x-large')
data0.plot(x=data0.x, y=data0.y, ax=axes[0,0],kind='scatter')
data1.plot(x=data1.x, y=data1.y, ax=axes[0,1],kind='scatter')
axes[0,0].set_title('title 0')
axes[0,1].set_title('title 1')

我不知道如何为 axes[0,0][0,1] 一起设置标题。我在文档中也找不到任何内容。我不喜欢为了实现这一点而在 latex 表上大惊小怪。有什么指点吗?

最佳答案

使用 fig.suptitle() 设置图形标题,使用 ax.set_title() 设置轴(子图)标题非常简单。对于设置中间的列跨越标题,确实没有内置选项。

解决此问题的一种方法是使用 plt.figtext()在适当的位置。人们需要为该标题考虑一些额外的空间,例如通过使用 fig.subplots_adjust并找到这个图文的适当位置。在下面的示例中,我们使用标题应跨越的轴的边界框来找到一个集中的水平位置。垂直位置是最好的猜测。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
y = np.random.rand(10,8)

colors=["b", "g", "r", "violet"]
fig, axes = plt.subplots(nrows=2, ncols=4, sharex=True, sharey=True, figsize=(8,5))
#set a figure title on top
fig.suptitle("Very long figure title over the whole figure extent", fontsize='x-large')
# adjust the subplots, i.e. leave more space at the top to accomodate the additional titles
fig.subplots_adjust(top=0.78)

ext = []
#loop over the columns (j) and rows(i) to populate subplots
for j in range(4):
for i in range(2):
axes[i,j].scatter(x, y[:,4*i+j], c=colors[j], s=25)
# each axes in the top row gets its own axes title
axes[0,j].set_title('title {}'.format(j+1))
# save the axes bounding boxes for later use
ext.append([axes[0,j].get_window_extent().x0, axes[0,j].get_window_extent().width ])

# this is optional
# from the axes bounding boxes calculate the optimal position of the column spanning title
inv = fig.transFigure.inverted()
width_left = ext[0][0]+(ext[1][0]+ext[1][1]-ext[0][0])/2.
left_center = inv.transform( (width_left, 1) )
width_right = ext[2][0]+(ext[3][0]+ext[3][1]-ext[2][0])/2.
right_center = inv.transform( (width_right, 1) )

# set column spanning title
# the first two arguments to figtext are x and y coordinates in the figure system (0 to 1)
plt.figtext(left_center[0],0.88,"Left column spanning title", va="center", ha="center", size=15)
plt.figtext(right_center[0],0.88,"Right column spanning title", va="center", ha="center", size=15)
axes[0,0].set_ylim([0,1])
axes[0,0].set_xlim([0,10])

plt.show()

enter image description here

关于python - 跨越两个(或任意数量的)子图列的 Matplotlib 标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40936729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com