【问题标题】:matplotlib savefig - text chopped off [duplicate]matplotlib savefig - 文本被切掉[重复]
【发布时间】:2017-07-21 13:42:56
【问题描述】:

假设我创建了一个情节:

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)时,情节显示正常。但是,当我查看保存的图像时,它呈现如下:

如您所见,文本被截断。 处理此问题的推荐做法是什么?

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

注意。虽然a similar question 存在,但这个问题的不同之处在于:

  • 同时处理xlabelylabel
  • 结合set_size_inchesfunction
  • 力求确保文字大小与不同的图形大小保持一致。
  • 试图找出 Ipython 输出不同的原因 来自savefig

【问题讨论】:

  • 您在 savefig 之前尝试过:plt.tight_layout()(右)吗? docs
  • 我认为@tom 是正确的,这是重复的;虽然使用bbox_inches = "tight" 的解决方案在这里特别有趣,将结果与 IPython 内联输出进行比较,但在提出重复问题时可能不可用。
  • @ImportanceOfBeingErnest 同意。可能还有其他更新的重复目标也可以链接到;这是一个非常常见的问题。
  • @ImportanceOfBeingErnest 和 tom:很公平,我期待搜索结果,或者当我输入问题时 - 可能有什么结果但我错过了。然而,我认为它仍然值得保留,因为它可能对未来的搜索者有用。

标签: python matplotlib


【解决方案1】:

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% 空间等)。

【讨论】:

  • 第一个解决方案对我有用。我总是使用tight_layout,但不幸的是 savefig 仍然切断了部分情节。 savefig 中的 bbox_inches 选项纠正了这一点。
  • 唯一真正有效的解决方案!谢谢,伙计!
  • bbox_inches = "tight" 添加到savefig() 解决了我的问题。
【解决方案2】:

matplotlib 有一个名为tight_layout 的函数,它自动调整子图参数,使子图适合图形区域。

如文档中所述,它被标记为实验性,但很常用。

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2013-12-19
      • 2017-02-26
      • 2018-08-08
      • 2022-01-11
      相关资源
      最近更新 更多