matplotlib 如何定位字幕

avkwfej4  于 2022-11-30  发布在  其他
关注(0)|答案(4)|浏览(182)

我试图调整一个suptitle以上的多面板数字,我有麻烦弄清楚如何调整figsize和随后的位置字幕。
问题是调用plt.suptitle("my title", y=...)来调整字幕的位置也会调整图形的尺寸。

  1. suptitle(..., y=1.1)实际上把标题放在哪里呢?据我所知,suptitle的y参数的文档指向matplotlib.text.text,但我不知道当你有多个子情节时,图形坐标是什么意思。
    1.将y指定为suptitle时,对图形大小有何影响?
    1.如何手动调整图形大小和间距(subplots_adjust?),以便为每个面板添加一个图形标题,为整个图形添加一个副标题,同时保持图形中每个轴的大小?
    举个例子:
data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5))

a[0,0].plot(data)
a[0,0].set_title("this is a really long title\n"*2)
a[0,1].plot(data)
a[1,1].plot(data)

plt.suptitle("a big long suptitle that runs into the title\n"*2, y=1.05);

很明显,我可以在每次绘制图形时调整y,但是我需要一个通常不需要人工干预的解决方案。但两者都不能可靠地处理任何复杂的图形。

j0pj023g

j0pj023g1#

1.地物坐标的含义是什么?

图的坐标从0到1,其中(0,0)是左下角,(1,1)是右上角,因此坐标y=1.05稍微在图的外部。

2.指定y为字幕时,对图形大小有何影响?

指定y作为字幕对插图大小没有任何影响。

3a.如何手动调整图的大小和间距,以便为每个面板添加图标题,并为整个图添加副标题?

首先,不要添加额外的换行符。即如果你想要2行,不要使用3个换行符(\n)。然后,你可以根据需要调整子情节参数,为标题留出空间。例如,fig.subplots_adjust(top=0.8),并使用y <= 1将标题置于图内。

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5))
fig.subplots_adjust(top=0.8)

axes[0,0].plot(data)
axes[0,0].set_title("\n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)

fig.suptitle("\n".join(["a big long suptitle that runs into the title"]*2), y=0.98)

plt.show()

3b....同时保持图中每个斧头的大小?

只有通过更改图形的整体大小,才能保持轴的大小并为标题留出足够的空间。
我们定义一个函数make_space_above,它将坐标轴数组作为输入,并输入新的上边距(单位为英寸)。例如,您得出的结论是,您需要在顶部留出1英寸的边距来存放标题:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5), squeeze = False)

axes[0,0].plot(data)
axes[0,0].set_title("\n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)

fig.suptitle("\n".join(["a big long suptitle that runs into the title"]*2), y=0.98)

def make_space_above(axes, topmargin=1):
    """ increase figure size to make topmargin (in inches) space for 
        titles, without changing the axes sizes"""
    fig = axes.flatten()[0].figure
    s = fig.subplotpars
    w, h = fig.get_size_inches()

    figh = h - (1-s.top)*h  + topmargin
    fig.subplots_adjust(bottom=s.bottom*h/figh, top=1-topmargin/figh)
    fig.set_figheight(figh)

make_space_above(axes, topmargin=1)    

plt.show()

(left:不调用make_space_above;右:调用make_space_above(axes, topmargin=1)

bxgwgixi

bxgwgixi2#

简短回答

对于来自Google的用于调整标题在散布矩阵上的位置的命令,只需将y参数设置为略小于1的值:
plt.suptitle('My Title', y=0.92)

1sbrub3j

1sbrub3j3#

...或使用约束布局(_L):

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5), constrained_layout=True)

a[0,0].plot(data)
a[0,0].set_title("this is a really long title\n"*2)
a[0,1].plot(data)
a[1,1].plot(data)

plt.suptitle("a big long suptitle that runs into the title\n"*2);

zi8p0yeb

zi8p0yeb4#

这是一个有点笨拙的解决方案,但如果你的图只有1列,也许可以考虑在第一个图的标题中添加主标题,如下所示:

ax[0].set_title("Main Title\

相关问题