相对于多图中图形的 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 解决了问题。
我想将具有多个子图的图的图例相对于整个图移动到中上部。我尝试使用 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 解决了问题。