matplotlib savefig - 文字切断

时间:2017-07-21 13:42:57

标签: python matplotlib

说我创建了一个情节:

import matplotlib.pyplot as plt
plt.clf()
import numpy as np
props = np.random.randint(0,100,(200,))
x=np.arange(1,201,1)
plt.plot(x,props,c='k')
plt.xlabel('blah blah blah blah blah blah\n blah blah blah blah blah')
plt.ylabel('blah blah blah blah blah blah blah blah blah')
fig=plt.gcf()
fig.set_size_inches(3.75,3.75)#14, 23)
plt.savefig('testfig.png',dpi=300)

当使用Ipython(通过Spyder)时,情节显示正常。但是,当我查看保存的图像时,它显示出来:

enter image description here

正如您所看到的,文字已被切断。 处理此问题的建议做法是什么?

我已经通过增加数字大小来绕过它,然后重新调整大小。但是,我的目标是生成一组具有一致文本大小的图像(图形大小不同);所以这种方法并不理想。

注意。虽然存在a similar question,但这个问题的区别在于:

  • 同时处理xlabelylabel
  • set_size_inches功能
  • 结合使用
  • 旨在确保文字大小一致,且数字大小不同。
  • 试图找出Ipython输出不同的原因 来自savefig

3 个答案:

答案 0 :(得分:6)

matplotlib有一个名为tight_layout 的函数,会自动调整子图段参数,以便子图符合图形区域。

正如文档中所述,它被标记为 experimental ,但是常用。

根据我的经验,它应尽可能晚地调用(例如在使用savefig之前),也可能在调用更改几何体的调用之后调用(如fig.set_size_inches)。

plt.show() gui窗口中,其中一个按钮也正在执行此调用。

(转换为之前评论的答案)

答案 1 :(得分:6)

Spyder中的Ipython控制台使用inline后端,将图形保存为png并显示输出图像。保存时,它使用选项bbox_inches = "tight"

因此,为了获得控制台中显示的相同图形,您可以决定使用此选项 - 它基本上扩展或缩小边界框,以便显示画布中的所有对象。

plt.savefig('testfig.png',dpi=300, bbox_inches = "tight")

或者,您可以在保存或显示图形之前确保所有对象都已在图形边界内。这可以使用

完成
plt.tight_layout()

尝试自动执行此操作,或者您可以使用

plt.subplots_adjust(left=0.3, right=0.9, bottom=0.3, top=0.9)

其中参数表示每一边的边距,以图形大小的分数为单位(左边30%的空间,右边的10%空间等)。

答案 2 :(得分:1)

我认为答案是elsewhere on stackoverflow。 简而言之,您应该使用标签文本的字体大小:

plt.ylabel('Example', fontsize=40)
plt.xlabel('Example', fontsize=40)

当然,将数字40(试错)更改为更合适的值。

我不知道这是修复还是解决方法。 我也不知道这是否有帮助。