Matplotlib图例相对于多色图中的数字

时间:2015-04-09 13:19:47

标签: python matplotlib legend subplot

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

enter image description 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)

2 个答案:

答案 0 :(得分:2)

如果用这个替换生成图例的行:

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罚款:

enter image description here

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

答案 1 :(得分:0)

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