我的matplotlib.pyplot传奇正在被切断

use*_*909 32 python matplotlib

我正在尝试使用matplotlib创建一个带有图例的图表.我可以看到正在创建绘图,但图像边界不允许显示整个图例.

lines = []
ax = plt.subplot(111)
for filename in args:
    lines.append(plt.plot(y_axis, x_axis, colors[colorcycle], linestyle='steps-pre', label=filename))
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
Run Code Online (Sandbox Code Playgroud)

这会产生: 在此输入图像描述

str*_*ter 37

虽然现在已经晚了,但我想提到一个不错的最近推出的替代方案:

新的matplotlib功能:紧密的边界框

如果你对以下的输出文件感兴趣plt.savefig:在这种情况下,旗帜bbox_inches='tight'是你的朋友!

import matplotlib.pyplot as plt

fig = plt.figure(1)
plt.plot([1, 2, 3], [1, 0, 1], label='A')
plt.plot([1, 2, 3], [1, 2, 2], label='B')
plt.legend(loc='center left', bbox_to_anchor=(1, 0))

fig.savefig('samplefigure', bbox_inches='tight')
Run Code Online (Sandbox Code Playgroud)

输出文件:samplefigure.png

我还想提一个更详细的答案:在轴外移动matplotlib图例使其被图框切断

好处

  • 无需调整实际数据/图片.
  • 它和plt.subplots其他人一样兼容!
  • 它至少适用于最常用的输出文件,例如png,pdf.

  • 这应该是接受的答案,imho (3认同)
  • 这应该是plt.savefig()的默认值 (2认同)
  • 工作了,谢谢!仅供参考,以下是 matplotlib 的文档:> Bbox(以英寸为单位)。仅保存图形的给定部分。如果“紧”,请尝试找出图形的紧边界框。如果没有,请使用 savefig.bbox ^^^ wtf 这意味着什么?写这篇文章的人应该被踢脸。 (2认同)

gca*_*tes 21

正如亚当指出的那样,你需要在图表的一侧留出空间.如果要微调所需的空间,可能需要查看matplotlib.pyplot.artist 的add_axes方法.

以下是一个快速示例:

import matplotlib.pyplot as plt
import numpy as np

# some data
x = np.arange(0, 10, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

# plot of the data
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.6, 0.75])
ax.plot(x, y1,'-k', lw=2, label='black sin(x)')
ax.plot(x, y2,'-r', lw=2, label='red cos(x)')
ax.set_xlabel('x', size=22)
ax.set_ylabel('y', size=22)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()
Run Code Online (Sandbox Code Playgroud)

和结果图像: 图片

  • 我知道matplotlib喜欢宣传所有东西都在用户的控制之下,但是传说中的这一切都太好了.如果我把传说放在外面,我显然希望它仍然可见.窗口应该只是缩放以适应而不是创建这个巨大的重新缩放麻烦.至少应该有一个默认的True选项来控制这种自动缩放行为.迫使用户通过一系列荒谬的重新渲染来尝试以控制的名义获得缩放数字,从而完成相反的操作. (66认同)
  • 我正在查看此代码几分钟,但仍然不知道哪一行解决了问题 (4认同)
  • @strpeter 在他的回答中提供了一个自动解决方案,对我来说效果很好。 (2认同)

eco*_*coe 6

这是另一种制作空间的方法(缩小轴):

# get the current axis
ax = plt.gca()
# Shink current axis by 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
Run Code Online (Sandbox Code Playgroud)

其中0.8将轴的宽度缩放20%.在我的win7 64机器上,使用大于1的因子将为图例提供空间,如果它在图表之外.

此代码引用自:如何将图例放出图表


小智 5

只需使用 plt.tight_layout()

import matplotlib.pyplot as plt
    
fig = plt.figure(1)
plt.plot([1, 2, 3], [1, 0, 1], label='A')
plt.plot([1, 2, 3], [1, 2, 2], label='B')
plt.legend(loc='center left', bbox_to_anchor=(1, 0))

plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

这可能是在较新matplotlib版本中引入的,并且可以很好地完成这项工作。