图例比轴宽的紧凑布局

Tight Layout With Legend Wider than Axes

我正在使用 GUI 绘制绘图,该 GUI 在轴上方放置了一个长图例句柄。图例比坐标轴宽,所以我尝试使用 fig.tight_layout().

扩展坐标轴以匹配图例购买的宽度

但是,我发现当调用 tight_layout() 时,这会减小轴的宽度,而不是像预期的那样填充图例下方的 space。

这是我在调用 tight_layout() 之前的数字。

并在调用 tight_layout() 之后。

令人惊讶的是,我发现在每次 tight_layout() 调用后轴的宽度都会减小。当图例比轴宽时调用 tight_layout() 是否有问题?当图例宽度小于图形时,不会发生这种情况。

这是重现图形和行为的代码。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# make dataframe with random data
np.random.seed(seed=7)
data1 = np.random.normal(size=100)
name1 = 'handle_with_a_really_really_really_really_long_name'
d = {name1: data1}
df = pd.DataFrame(data=d)

# plotting stuff
fig = plt.figure(figsize=(4, 4))
ax = fig.add_subplot(111)
df.plot(ax=ax, kind='hist')
ax.legend(loc='lower left', bbox_to_anchor=(-0.04, 1.05))

# tight layout calls to reduce axis width
#fig.tight_layout()
#fig.tight_layout()
#fig.tight_layout()

The axes 试图使自己足够小,以至于 none 它的艺术家与任何其他轴或图形的边缘重叠。在这种情况下,它无法使自己足够小以不溢出图的边缘,但它一直在尝试。

为什么要打电话给tight_layout?您可以从 tight_layout leg=legend()leg.set_in_layout(False) 中取出图例,然后调用 tight_layout 获得正确的宽度,然后使用 subplots_adjust 使足够房间在顶部。但是你也可以让标签的长度更合理。

感谢 Jody 的回复,我意识到图例尺寸比数字大。这就是造成 Jody 描述的收缩轴的原因。

解决方法是在这种情况下调整图形大小,然后使用紧凑布局。这将修复收缩轴行为。