我绘制了一个全屏图形,并希望使用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后端。 如果有人设法更改此代码,以便正确保存显示的图形(相同的整体大小,相同的字体大小,相同的线条粗细),我将非常感激!
答案 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()
现在,我终于将我的情节保存完全正如我在屏幕上显示的那样!