将Fig.legend与matplotlib中的子图相结合

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

编辑:这已在最新版本的 matplotlib 中修复了here


免责声明:我知道在这个简单的示例中使用子图是无关紧要的,后者仅用于显示我的问题:我希望能够将

fig.legend()
fig.subfigures1
一起使用。


我目前正在发现 matplotlib 的新 subfigure 模块。我注意到当主图包含子图时,使用

fig.legend()
创建的图例不会显示:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 10, 10)
y1 = x
y2 = -x

fig = plt.figure(constrained_layout=True)
subfigs = fig.subfigures(nrows=2, ncols=1)

for subfig in subfigs:
    axarr = subfig.subplots(1, 2)
    for ax in axarr.flatten():
        l1, = ax.plot(x, y1, label='line1')
        l2, = ax.plot(x, y2, label='line2')
            #
        ax.legend()
    # subfig.legend(handles=[l1, l2], loc='upper center', ncol=2)
fig.legend(handles=[l1, l2], loc='upper center', ncol=2)
plt.savefig('subfigures_figlegend.png', dpi=200)

enter image description here

请注意该图例是如何缺失的。为了进行比较,请注意仅使用

plt.subplots
时会显示 :

fig, axarr = plt.subplots(2, 2, constrained_layout=True)
for ax in axarr.flatten():
    l1, = ax.plot(x, y1, label='line1')
    l2, = ax.plot(x, y2, label='line2')
    #
    ax.legend()
fig.legend(handles=[l1, l2], loc='upper center', ncol=2)
plt.savefig('subplots_figlegend.png', dpi=200)

enter image description here

python matplotlib legend
1个回答
1
投票

当我运行你的代码时,图例就在那里,但它位于图的后面并略高于图,然后在调用

plt.savefig()
时被切断。我能够让它与
bbox_inches='tight'
plt.savefig()
参数以及以下移动图例一起使用。

fig.legend(handles=[l1, l2], bbox_to_anchor=(0.7, 1.1), ncol=2)

enter image description here

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