65

我在 matplotlib 中使用 pylab 创建绘图并将绘图保存到图像文件中。但是,当我使用 保存图像时pylab.savefig( image_name ),我发现保存的SIZE图像与我使用时显示的图像相同pylab.show()

碰巧,我在图中有很多数据,当我使用 时pylab.show(),我必须最大化窗口才能正确看到所有图,并且 xlabel 代码不会相互叠加。

无论如何,我可以在将图像保存到文件之前以编程方式“最大化”窗口吗?- 目前,我只得到“默认”窗口大小的图像,这会导致 x 轴标签相互叠加。

4

8 回答 8

59

matplotlib(pylab)中有两个主要的选项来控制图像大小:

  1. 您可以以英寸为单位设置结果图像的大小
  2. 您可以为输出文件定义 DPI(每英寸点数)(基本上,它是一个分辨率)

通常,您希望两者都做,因为这样您就可以完全控制生成的图像大小(以像素为单位)。例如,如果要精确渲染 800x600 的图像,可以使用 DPI=100,并将尺寸设置为 8 x 6 英寸:

import matplotlib.pyplot as plt
# plot whatever you need...
# now, before saving to file:
figure = plt.gcf() # get current figure
figure.set_size_inches(8, 6)
# when saving, specify the DPI
plt.savefig("myplot.png", dpi = 100)

可以使用任何 DPI。事实上,您可能想要使用各种 DPI 和大小值来获得您最喜欢的结果。但是请注意,使用非常小的 DPI 并不是一个好主意,因为 matplotlib 可能找不到合适的字体来渲染图例和其他文本。例如,您不能设置 DPI=1,因为没有以 1 像素呈现字符的字体 :)

从其他评论中,我了解到您遇到的其他问题是正确的文本渲染。为此,您还可以更改字体大小。例如,您可以使用每个字符 6 个像素,而不是默认使用的每个字符 12 个像素(实际上,使所有文本变小两倍)。

import matplotlib
#...
matplotlib.rc('font', size=6)

最后,对原始文档的一些参考: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefighttp://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot .gcfhttp : //matplotlib.sourceforge.net/api/figure_api.html#matplotlib.figure.Figure.set_size_inches,http: //matplotlib.sourceforge.net/users/customizing.html#dynamic-rc-settings

PS 抱歉,我没有使用 pylab,但据我所知,以上所有代码在 pylab 中的工作方式都相同 - 只需plt在我的代码中替换为pylab(或您在导入 pylab 时指定的任何名称)。相同的matplotlib- 使用pylab

于 2012-04-21T19:16:04.223 回答
32

您在初始化时设置大小:

fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # in inches!

编辑

如果问题出在 x 轴刻度上 - 您可以“手动”设置它们:

fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) # You can actually compute the interval You need - and substitute here

依此类推,你的情节的其他方面。您可以全部配置。这是一个例子:

from numpy import arange
import matplotlib
# import matplotlib as mpl
import matplotlib.pyplot
# import matplotlib.pyplot as plt

x1 = [1,2,3]
y1 = [4,5,6]
x2 = [1,2,3]
y2 = [5,5,5]

# initialization
fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # The size of the figure is specified as (width, height) in inches

# lines:
l1 = fig2.add_subplot(111).plot(x1,y1, label=r"Text $formula$", "r-", lw=2)
l2 = fig2.add_subplot(111).plot(x2,y2, label=r"$legend2$" ,"g--", lw=3)
fig2.add_subplot(111).legend((l1,l2), loc=0)

# axes:
fig2.add_subplot(111).grid(True)
fig2.add_subplot(111).set_xticks(arange(1,3,0.5))
fig2.add_subplot(111).axis(xmin=3, xmax=6) # there're also ymin, ymax
fig2.add_subplot(111).axis([0,4,3,6]) # all!
fig2.add_subplot(111).set_xlim([0,4])
fig2.add_subplot(111).set_ylim([3,6])

# labels:
fig2.add_subplot(111).set_xlabel(r"x $2^2$", fontsize=15, color = "r")
fig2.add_subplot(111).set_ylabel(r"y $2^2$")
fig2.add_subplot(111).set_title(r"title $6^4$")
fig2.add_subplot(111).text(2, 5.5, r"an equation: $E=mc^2$", fontsize=15, color = "y")
fig2.add_subplot(111).text(3, 2, unicode('f\374r', 'latin-1'))

# saving:
fig2.savefig("fig2.png")

那么 - 您究竟想要配置什么?

于 2012-04-06T09:36:52.600 回答
11

我认为您需要在将图形保存到文件时指定不同的分辨率:

fig = matplotlib.pyplot.figure()
# generate your plot
fig.savefig("myfig.png",dpi=600)

指定较大的 dpi 值应该具有与最大化 GUI 窗口类似的效果。

于 2012-04-18T17:04:15.717 回答
4

检查这个: 如何使用 Python 最大化 plt.show() 窗口

该命令因您使用的后端而异。我发现这是确保保存的图片具有与我在屏幕上查看的相同比例的最佳方法。

由于我将 Canopy 与 QT 后端一起使用:

pylab.get_current_fig_manager().window.showMaximized()

然后我根据需要调用 savefig() 并根据 silvado 的回答增加 DPI。

于 2013-09-26T00:11:20.857 回答
3

我有这个确切的问题,这有效:

plt.savefig(output_dir + '/xyz.png', bbox_inches='tight')

这是文档:

[ https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.savefig.html][1]

于 2020-02-12T16:25:47.857 回答
3

您可以在保存的图形中查看它的大小,例如 1920x983 像素(我保存最大化窗口时的大小),然后我将 dpi 设置为 100,将大小设置为 19.20x9.83 并且效果很好。保存完全等于最大化的数字。

import numpy as np
import matplotlib.pyplot as plt
x, y = np.genfromtxt('fname.dat', usecols=(0,1), unpack=True)
a = plt.figure(figsize=(19.20,9.83))
a = plt.plot(x, y, '-')
plt.savefig('file.png',format='png',dpi=100)
于 2019-12-22T00:07:50.950 回答
1

我之前做过同样的搜索,看来他的确切解决方案取决于后端。

我已经阅读了一堆资料,可能最有用的是 Pythonio 在此处的答案如何使用 Python 最大化 plt.show() 窗口 我调整了代码并最终得到了下面的函数。它在 Windows 上工作得很好,我主要使用 Qt,我经常使用它,而它与其他后端的测试很少。

基本上它包括识别后端和调用适当的函数。请注意,我后来添加了一个暂停,因为我遇到了一些窗口最大化而其他窗口没有最大化的问题,这似乎为我解决了。

def maximize(backend=None,fullscreen=False):
    """Maximize window independently on backend.
    Fullscreen sets fullscreen mode, that is same as maximized, but it doesn't have title bar (press key F to toggle full screen mode)."""
    if backend is None:
        backend=matplotlib.get_backend()
    mng = plt.get_current_fig_manager()

    if fullscreen:
        mng.full_screen_toggle()
    else:
        if backend == 'wxAgg':
            mng.frame.Maximize(True)
        elif backend == 'Qt4Agg' or backend == 'Qt5Agg':
            mng.window.showMaximized()
        elif backend == 'TkAgg':
            mng.window.state('zoomed') #works fine on Windows!
        else:
            print ("Unrecognized backend: ",backend) #not tested on different backends (only Qt)
    plt.show()

    plt.pause(0.1) #this is needed to make sure following processing gets applied (e.g. tight_layout)
于 2018-09-14T02:54:51.290 回答
-1

If I understand correctly what you want to do, you can create your figure and set the size of the window. Afterwards, you can save your graph with the matplotlib toolbox button. Here an example:

from pylab import get_current_fig_manager,show,plt,imshow

plt.Figure()
thismanager = get_current_fig_manager()
thismanager.window.wm_geometry("500x500+0+0") 
#in this case 500 is the size (in pixel) of the figure window. In your case you want to maximise to the size of your screen or whatever

imshow(your_data)
show()
于 2012-04-18T16:46:00.370 回答