ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Matplotlib 中为子图添加标题

我有一个包含许多子图的图形。

fig = plt.figure(num=None, figsize=(26, 12), dpi=80, facecolor='w', edgecolor='k')
fig.canvas.set_window_title('Window Title')

# Returns the Axes instance
ax = fig.add_subplot(311) 
ax2 = fig.add_subplot(312) 
ax3 = fig.add_subplot(313) 

如何为子图添加标题?

fig.suptitle 为所有图表添加标题,虽然 ax.set_title() 存在,但后者不会为我的子图添加任何标题。

谢谢您的帮助。

编辑:更正了关于 set_title() 的错字。谢谢罗格·卡西斯


J
Jarad

ax.title.set_text('My Plot Title') 似乎也有效。

fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)
ax1.title.set_text('First Plot')
ax2.title.set_text('Second Plot')
ax3.title.set_text('Third Plot')
ax4.title.set_text('Fourth Plot')
plt.show()

https://i.stack.imgur.com/dUp6p.png


对于任何对直方图的字体大小有疑问的人,奇怪的是减少箱的数量让我增加它。从500涨到100。
如果您需要能够指定字体大小,请改用 ax.set_title('title', fontsize=16)
@TobiasP.G.,您如何在子图中定位标题?
嗨@Jarad,谢谢你的回答。当时,我使用了 ax2.text(),因为 ax2.title.set_y() 无法正常工作。给定 4 个相同大小的子图,如果我为每个子图的 axis.title.set_y() 赋予 $y$ 的价值 $0.9$,它仍然将标题放在奇怪的位置,并且与每个子图都不匹配。
W
Will Vousden

ax.set_title() 应为单独的子图设置标题:

import matplotlib.pyplot as plt

if __name__ == "__main__":
    data = [1, 2, 3, 4, 5]

    fig = plt.figure()
    fig.suptitle("Title for whole figure", fontsize=16)
    ax = plt.subplot("211")
    ax.set_title("Title for first plot")
    ax.plot(data)

    ax = plt.subplot("212")
    ax.set_title("Title for second plot")
    ax.plot(data)

    plt.show()

你能检查一下这段代码是否适合你吗?也许以后有东西会覆盖它们?


这对我有用,matplotlib 版本 1.2.2 python 2.7.5
在 matplotlib 3.5.2 上,这会在 plt.subplot("211") / plt.subplot("212") 上引发 ValueError 。解决方案是用整数参数 plt.subplot(211) & plt.subplot(212) 替换。
M
MRichards

假设 import matplotlib.pyplot as plt 的简写答案:

plt.gca().set_title('title')

如:

plt.subplot(221)
plt.gca().set_title('title')
plt.subplot(222)
etc...

那么就不需要多余的变量了。


这种方法很好,因为它可以更好地控制标题位置...例如,通过添加 kwarg y=0.7 您可以在子图中绘制子图标题
L
Lucas

如果你想让它更短,你可以写:

import matplotlib.pyplot as plt
for i in range(4):
    plt.subplot(2,2,i+1).set_title(f'Subplot n°{i+1}')
plt.show()

它可能不太清楚,但您不需要更多的行或变量


对于只是复制粘贴的任何人,导入时都会出现拼写错误
J
JMDE

我越来越倾向于使用的解决方案是:

import matplotlib.pyplot as plt

fig, axs = plt.subplots(2, 2)  # 1
for i, ax in enumerate(axs.ravel()): # 2
    ax.set_title("Plot #{}".format(i)) # 3

创建任意数量的轴 axs.ravel() 将您的 2-dim 对象转换为行主要样式的 1-dim 向量 将标题分配给当前轴对象


D
Derlin

如果您有多个图像并且您想要循环它们并与标题一起一一显示它们 - 这就是您可以做的。无需显式定义 ax1、ax2 等。

问题是您可以在代码的第 1 行中定义动态轴(ax),并且可以在循环内设置其标题。二维数组的行是轴(ax)的长度(len)每行有2个项目,即它是列表中的列表(第2点)set_title可用于设置标题,一旦正确的轴(ax)或子图被选中。

import matplotlib.pyplot as plt    
fig, ax = plt.subplots(2, 2, figsize=(6, 8))  
for i in range(len(ax)): 
    for j in range(len(ax[i])):
        ## ax[i,j].imshow(test_images_gr[0].reshape(28,28))
        ax[i,j].set_title('Title-' + str(i) + str(j))

M
MRUNAL MUNOT

您只能通过迭代为每个图表赋予不同的标题和标签。

titles = {221: 'First Plot', 222: 'Second Plot', 223: 'Third Plot', 224: 'Fourth Plot'}
fig = plt.figure()
for x in range(221,225):
  ax = fig.add_subplot(x)
  ax.title.set_text(titles.get(x))

plt.subplots_adjust(left=0.1,
                    bottom=0.1, 
                    right=0.9, 
                    top=0.9, 
                    wspace=0.4, 
                    hspace=0.4)
plt.show()

输出:

https://i.stack.imgur.com/LLEvA.png


subplots_adjust 调用可修复重叠的标题。所以这非常有用。谢谢!
W
Wojciech Moszczyński
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=1, ncols=4,figsize=(11, 7))

grid = plt.GridSpec(2, 2, wspace=0.2, hspace=0.5)

ax1 = plt.subplot(grid[0, 0])
ax2 = plt.subplot(grid[0, 1:])
ax3 = plt.subplot(grid[1, :1])
ax4 = plt.subplot(grid[1, 1:])

ax1.title.set_text('First Plot')
ax2.title.set_text('Second Plot')
ax3.title.set_text('Third Plot')
ax4.title.set_text('Fourth Plot')

plt.show()

https://i.stack.imgur.com/EuMDf.png


J
Joma

从 matplotlib 3.4.3 开始,Figure.add_subplot 函数支持标题为:

fig.add_subplot(311, title="first")
fig.add_subplot(312, title="second")

d
divenex

为了完整起见,也可以在不明确参考图形轴的情况下实现所请求的结果,如下所示:

import matplotlib.pyplot as plt

plt.subplot(221)
plt.title("Title 1")

plt.subplot(222)
plt.title("Title 2")

plt.subplot(223)
plt.title("Title 3")

plt.subplot(224)
plt.title("Title 4")

https://i.stack.imgur.com/6HPTU.png

如果您遇到标签重叠问题,请在最后一个绘图后使用 plt.tight_layout()