我熟悉以下问题:
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上有这个代码的(稍微)长一点的版本
5条答案
按热度按时间kuhbmx9i1#
对不起EMS,但我实际上刚刚从matplotlib邮件列表中得到了另一个回复(感谢Benjamin Root)。
我正在寻找的代码是调整savefig调用:
这显然类似于调用tight_layout,但您允许savefig在计算中考虑额外的艺术家。这实际上确实根据需要调整了图框的大小。
这产生:
[编辑]这个问题的目的是完全避免使用任意文本的任意坐标放置,这是这些问题的传统解决方案。尽管如此,最近许多编辑坚持要把这些放进去,通常是以导致代码引发错误的方式。现在我已经修复了这些问题,并整理了任意文本,以展示如何在bbox_extra_arts算法中考虑这些问题。
busg9geu2#
**添加:**我发现了一些应该立即完成的技巧,但下面的代码的其余部分也提供了一个替代方案。
使用
subplots_adjust()
函数向上移动子图的底部:然后使用legend命令的legend
bbox_to_anchor
部分中的偏移量,以将图例框放置在所需的位置。设置figsize
和使用subplots_adjust(bottom=...)
的一些组合应该会为您生成一个高质量的图。**Alternative:**我只是简单地改变了行:
致:
改变了
到
而且它在我的屏幕上显示得很好(一个24英寸的CRT显示器)。
这里
figsize=(M,N)
将图形窗口设置为M英寸乘N英寸。只是玩这个,直到它看起来适合你。将其转换为更具可扩展性的图像格式,并在必要时使用GIMP进行编辑,或者在包含图形时使用LaTeXviewport
选项进行裁剪。bejyjqdl3#
这是另一个非常手动的解决方案。您可以定义轴的大小,并相应地考虑填充(包括图例和刻度线)。希望对某人有用。
示例(轴大小相同!):
验证码:
ui7jx7zq4#
我尝试了一个非常简单的方法,只是让图形更宽一点:
fig, ax = plt.subplots(1, 1, figsize=(a, b))
将
a
和b
调整到适当的值,以便图例包含在图中5sxhfpxr5#
既然google让我在这里问了一个类似的问题,那么现在你只需要使用
plt.savefig('myplot.png', bbox_inches='tight')
来扩展画布以适应一个图例。这里的大多数答案都过时了。