【发布时间】:2012-04-23 12:11:18
【问题描述】:
我熟悉以下问题:
Matplotlib savefig with a legend outside the plot
How to put the legend out of the plot
似乎这些问题的答案能够摆弄轴的精确缩小以使图例适合。
然而,缩小坐标轴并不是一个理想的解决方案,因为它会使数据变得更小,从而实际上更难以解释;特别是当它很复杂并且有很多事情发生时......因此需要一个大的传说
文档中的复杂图例示例说明了这样做的必要性,因为图中的图例实际上完全掩盖了多个数据点。
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
我希望能够动态扩展图形框的大小以适应扩展图形图例。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
请注意最终标签“反棕褐色”实际上是如何在图形框之外的(并且看起来很严重 - 不是出版质量!)
最后,有人告诉我这是 R 和 LaTeX 中的正常行为,所以我有点困惑为什么这在 python 中如此困难......有历史原因吗? Matlab 在这件事上是否同样糟糕?
我在 pastebin http://pastebin.com/grVjc007 上有这个代码的(只是稍微)更长的版本
【问题讨论】:
-
至于为什么是因为 matplotlib 面向交互式绘图,而 R 等则不是。 (是的,在这种特殊情况下,Matlab “同样糟糕”。)要正确地做到这一点,您需要担心每次调整图形大小、缩放或更新图例的位置时调整轴的大小。 (实际上,这意味着每次绘制绘图时都要检查,这会导致速度变慢。) Ggplot 等是静态的,所以这就是为什么它们默认情况下倾向于这样做,而 matplotlib 和 matlab 不这样做。话虽如此,
tight_layout()应该被更改以考虑传说。 -
我也在 matplotlib 用户邮件列表中讨论这个问题。所以我建议将 savefig 行调整为: fig.savefig('samplefigure', bbox_extra_artists=(lgd,), bbox='tight')
-
我知道 matplotlib 喜欢吹嘘一切都在用户的控制之下,但是这整个带有传说的东西实在是太好了。如果我把图例放在外面,我显然希望它仍然可见。窗口应该自行缩放以适应,而不是造成这种巨大的重新缩放麻烦。至少应该有一个默认的 True 选项来控制这种自动缩放行为。强迫用户通过大量的重新渲染来尝试以控制的名义获得正确的比例数字会起到相反的作用。
标签: python matplotlib legend