我试图在suptitle多面板图形上方进行调整,但在弄清楚如何调整figsize字体并随后放置字幕时遇到了麻烦。
问题在于调用plt.suptitle("my title", y=...)调整字幕的位置也会调整图形尺寸。几个问题:
suptitle(..., y=1.1)标题实际放在哪里?据我所知,ysuptitle参数的文档指向matplotlib.text.Text,但是当您有多个子图时,我不知道图形坐标的含义。
什么是对数字的大小指定时的效果y来suptitle?
如何手动调整图形尺寸和间距(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);
Run Code Online (Sandbox Code Playgroud)
显然,我每次做一个图形时都可以进行调整,但是我需要一个通常不需要人工干预就能解决的解决方案。我已经尝试过受限布局和紧凑布局。都无法可靠地处理任何复杂的图形。
Fer*_*ann 27
对于那些来自 Google 的用于调整散布矩阵上的标题位置的人,您可以简单地将y参数设置为略低于 1 的值:
plt.suptitle('My Title', y=0.92)
...或使用 constrained_layout:
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);
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
(左:未调用make_space_above;右:已调用make_space_above(axes, topmargin=1))
| 归档时间: |
|
| 查看次数: |
3680 次 |
| 最近记录: |