这是我的两个绘图函数和示例使用:
import matplotlib.pyplot as plt
def set_legend(ax, item_count, title=None):
legend = ax.legend(
title=title,
loc='upper center',
bbox_to_anchor=(0.5, -0.1),
ncol=item_count,
frameon=False,
prop={'size': 6}
)
legend.get_title().set_fontsize('8')
return ax
def generate_plot_base():
fig, ax = plt.subplots(1, 1, figsize=(6, 2.71), tight_layout={'pad': 0})
return ax
ax = generate_plot_base()
ax.plot([], [], label='Label 1', color='blue') # Toy labels
ax.plot([], [], label='Label 2', color='orange')
ax.plot([], [], label='Label 3', color='green')
ax = set_legend(ax, 3, title="Example Legend") # if you comment out the x-axis goes down
plt.show()
问题是 - 当我没有图例时,绘图的大小就是无花果大小。 但是,当我添加没有标题的图例时,图的底部会扩展以容纳图例。如果我添加图例标题,它会扩展得更多(或者如果我使用ight_layout,它会保持不变,但 x 轴在图中向上移动)。
相反,我想在底部和 x 轴之间添加额外的空间,这样如果我添加图例(带或不带图例标题),绘图的面积(像素尺寸)和轴的位置将保持不变,因为已经有足够的可用区域。
我尝试尝试使用ight_layout和subplot_adjust,但我无法得到我在这里描述的行为。
tight_layout
有一个 rect 参数,告诉它适合子图和其他艺术家的图形区域。这需要一些手动尝试和错误,但 rect=(0, 0.12, 1, 1)
似乎对于当前示例效果很好。
我们可以通过设置
legend.set_in_layout(False)
来告诉紧凑的布局忽略图例。
我还将图形的面色设为灰色,这样更容易在示例图中看到轴与图形之间的距离。
import matplotlib.pyplot as plt
def set_legend(ax, item_count, title=None):
legend = ax.legend(
title=title,
loc='upper center',
bbox_to_anchor=(0.5, -0.1),
ncol=item_count,
frameon=False,
prop={'size': 6}
)
legend.set_in_layout(False)
legend.get_title().set_fontsize('8')
return ax
def generate_plot_base():
fig, ax = plt.subplots(1, 1, figsize=(6, 2.71), tight_layout={'pad': 0, 'rect': (0, 0.12, 1, 1)}, facecolor='lightgray')
return ax
ax = generate_plot_base()
ax.plot([], [], label='Label 1', color='blue') # Toy labels
ax.plot([], [], label='Label 2', color='orange')
ax.plot([], [], label='Label 3', color='green')
ax = set_legend(ax, 3, title="Example Legend")
plt.show()
有图例:
没有图例: