相对于多图中图形的 Matplotlib 图例

Matplotlib legend relative to figure in multiplot

我想将具有多个子图的图的图例相对于整个图移动到中上部。我尝试使用 bbox_extra_artist 将使用 fig.legend 创建的图例对象传递给 fig.savefig,如 here 所述。然而,与描述不同的是,图例被截断了:

这是我使用的代码:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig, axes = plt.subplots(nrows=5, ncols=3, sharex=True, sharey=False)
legendLines = []
for rI, rA in enumerate(axes):
    for cI, ax in enumerate(rA):
        line, = ax.plot(x, np.sin(x), label='Sine')
        legendLines.append(line)
        line, = ax.plot(x, np.cos(x), label='Cosine')
        legendLines.append(line)
        line, = ax.plot(x, np.arctan(x), label='Inverse tan')
        legendLines.append(line)
        if cI == 0:
            ax.set_ylabel('foo')
        if rI == len(axes) -1:
            ax.set_xlabel('bar')
        if rI == 0:
            ax.set_title('baz')

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], 'upper center', frameon=False, ncol=3, borderaxespad=-0.7)
outFile = 'test.pdf'
fig.set_size_inches(8,7)
fig.tight_layout()
fig.savefig(outFile, bbox_extra_artists=[legend], bbox_inches='tight')
plt.close()

我正在寻找一种技术,让我可以定义相对于整个图形的图例位置,而不仅仅是子图。

更新:

如果我替换

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], 'upper center', frameon=False, ncol=3, borderaxespad=-0.7)

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], loc='lower center', frameon=False, ncol=3, bbox_to_anchor=(.5, 0.965))

结果是一样的:地块面积没有增加,图例从地块上移开。

(系统:matplotlib-1.2.0-py2.7-macosx-10.8-intel)

如果将生成图例的那一行替换为这一行:

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], loc='lower center', frameon=False, ncol=3, bbox_to_anchor=(.5, 1.))

似乎一切正常。

即使bbox_to_anchor=(0.5, 1.5)图例保存成pdf也可以:

这可能意味着将 matplotlib 更新到最新版本可能会解决问题。

更新到最新的 matplotlib 版本 1.4.3 解决了问题。