在 pyplot 中为图例保留空间,同时固定绘图大小和 x 轴位置

问题描述 投票:0回答:1

这是我的两个绘图函数和示例使用:

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,但我无法得到我在这里描述的行为。

python matplotlib plot visualization
1个回答
0
投票

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()

有图例:

enter image description here

没有图例:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.