Savefig无法正确保存显示的图

时间:2018-05-15 02:57:18

标签: python matplotlib plot save

我绘制了一个全屏图形,并希望使用savefig将其保存在.png中。结果是图像比绘制的图小得多。这不是dpi的问题(全局数字较小但字体和线宽大小合适,所以如果我增加dpi,字体会增加太多)。 这是一个非常简单的示例,您可以重现它:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0,10,0.01)
y1 = np.sin(x)
y2 = np.sin(3*x)
y3 = np.sin(5*x)

fig, ax = plt.subplots()
figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()
plt.subplots_adjust(bottom=0.09, top=0.96, right=0.97, left=0.07)

plt.plot(x,y1, 'C0', linewidth = 2)
plt.plot(x,y2, 'C1', linewidth = 2)
plt.plot(x,y3, 'C2', linewidth = 2)

plt.xlabel('x label', fontsize=18)
plt.ylabel('y label', fontsize=18)
plt.xticks(color='k', size=16)
plt.yticks(color='k', size=16)
plt.grid()
plt.legend(['blue', 'red', 'green'], fontsize=16)

fig.savefig('coco_gcf-dpi.png', dpi=plt.gcf().dpi, bbox_inches = 'tight')
fig.savefig('coco_200dpi.png', dpi=200, bbox_inches = 'tight')
plt.show()    

您可以看到保存的图表与屏幕上显示的图表不同。增加dpi无济于事。

我还应该指定我使用Python 3.6和Spyder 3.2.8和Qt5后端。 如果有人设法更改此代码,以便正确保存显示的图形(相同的整体大小,相同的字体大小,相同的线条粗细),我将非常感激!

2 个答案:

答案 0 :(得分:0)

脚本的最后几行应如下所示:

plt.tight_layout()
fig.savefig('coco_gcf-dpi.png', dpi=plt.gcf().dpi)
fig.savefig('coco_200dpi.png', dpi=200)
plt.show()

使用plt.tight_layout使得紧密布局适用于已保存和交互显示的图形。他们最初拥有它的方式,紧密的布局仅适用于已保存的数字。

答案 1 :(得分:0)

看起来showMaximized()仅适用于显示的图形,而不是应用于已保存的图形,因此我找到的唯一解决方案是摆脱showMaximized(),使用tkinter找到屏幕的大小,并使用这些尺寸来指定图形的大小:

import tkinter as tk
root = tk.Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()

以像素为单位返回屏幕的高度和宽度

mydpi = 100
fig, ax = plt.subplots(figsize=(width/mydpi, height/mydpi), dpi=mydpi)

设置图形的dpi,并使用之前找到的尺寸将图形的大小设置为全屏。

最后,完整的代码是:

import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk

root = tk.Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()

mydpi = 100
x = np.arange(0,10,0.01)
y1 = np.sin(x)
y2 = np.sin(3*x)
y3 = np.sin(5*x)

fig, ax = plt.subplots(figsize=(width/mydpi, height/mydpi), dpi=mydpi)
plt.subplots_adjust(bottom=0.09, top=0.96, right=0.97, left=0.07)

plt.plot(x,y1, 'C0', linewidth = 2)
plt.plot(x,y2, 'C1', linewidth = 2)
plt.plot(x,y3, 'C2', linewidth = 2)

plt.xlabel('x label', fontsize=18)
plt.ylabel('y label', fontsize=18)
plt.xticks(color='k', size=16)
plt.yticks(color='k', size=16)
plt.grid()
plt.legend(['blue', 'red', 'green'], fontsize=16)

fig.savefig('coco_gcf-dpi.png', dpi=plt.gcf().dpi, bbox_inches = 'tight')
plt.show()

现在,我终于将我的情节保存完全正如我在屏幕上显示的那样!