我熟悉以下问题:
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
What I would like to be able to do is dynamically expand the size of the figure box to accommodate the expanding figure legend.
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')
请注意最终标签'Inverse tan'实际上是如何在图框之外(看起来严重截止 - 不是出版质量!)
最后,我被告知这是R和LaTeX中的正常行为,所以我有点困惑为什么在python中这么难...有历史原因吗? Matlab在这件事上同样很差吗?
我在pastebin http://pastebin.com/grVjc007上有这个代码的(仅略微)更长版本
3 回答
对不起EMS,但实际上我从matplotlib mailling列表中得到了另一个回复(感谢Benjamin Root) .
我正在寻找的代码是将savefig调用调整为:
这显然类似于调用tight_layout,但您允许savefig在计算中考虑额外的艺术家 . 事实上,这确实根据需要调整了数字框的大小 .
这会产生:https://imgur.com/xzd8G87
Added: 我发现了一些应该立即行动的技巧,但下面的其余代码也提供了另一种选择 .
使用
subplots_adjust()
函数向上移动子图的底部:然后使用图例命令的图例
bbox_to_anchor
部分中的偏移量进行播放,以获得所需的图例框 . 设置figsize
和使用subplots_adjust(bottom=...)
的某些组合应为您生成质量图 .Alternative: 我只是更改了一行:
至:
并改变了
至
它在我的屏幕上显示得很好(一台24英寸的CRT显示器) .
这里
figsize=(M,N)
将图形窗口设置为M英寸×N英寸 . 只要玩这个,直到它看起来适合你 . 将其转换为更具伸缩性的图像格式,并在必要时使用GIMP进行编辑,或者在包含图形时使用LaTeXviewport
选项进行裁剪 .这是另一个非常手动的解决方案 . 您可以定义轴的大小,并相应地考虑填充(包括图例和刻度) . 希望它对某人有用 .
示例(轴大小相同!):
码: