您如何更改用matplotlib绘制的图形的大小?


2033

如何更改用matplotlib绘制的图形的大小?


740
plt.figure(figsize=(20,10))
StackG 2015年

305
fig, ax = plt.subplots(figsize=(20, 10))
alexw

99
考虑到图形大小以像素为单位,我指定了(800,600),程序崩溃了!请注意,单位为英寸。
拉贾

2
@alexw在文档中吗?

48
fig = plt.gcf()-> fig.set_size_inches(11,8)避免一劳永逸。
Ufos

Answers:


1099

该图告诉您呼叫签名:

from matplotlib.pyplot import figure
figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')

figure(figsize=(1,1)) 会创建一个一英寸一英寸的图像,该图像将是80 x 80像素,除非您还指定了不同的dpi参数。


95
如果已经创建完图形,说它是“ figure 1”(使用pyplot时是默认图形),则可以使用fig(num = 1,figsize =(8,6),...)更改其大小等。如果您使用pyplot / pylab并show()创建一个弹出窗口,则需要figure(num=1,...) 绘制任何内容之前先调用-pyplot / pylab 绘制内容后会立即创建一个图形,并显示弹出窗口的大小在这一点上要解决。
drevicko

22
我觉得如果删除默认参数,您的答案会更好。它不必要地降低了信噪比。
frmsaul

3
这是否意味着如果将DPI设置为1,则figsize变为像素单位而不是英寸单位?在Web和GUI界面上使用matplotlib时,这将更为有用。
CMCDragonkai

1
使用figsize(1,1),您在图像中的比例为1:1?因为我的所有饼图都显示为椭圆形,所以我发现使它们成为圆形的唯一方法是使用plot.axis(“ equals”)。他们会产生相同的效果还是行为不同?
Breno Baiardi

2
@BrenoBaiardi这个问题是关于人物的大小。即使图形整体为1:1,图形顶部的轴可能仍具有不相等的宽高比,即使坐标轴框为1:1,数据在x和y方向上的缩放比例也可能不同。因此,不,该命令将无法保证相等的宽高比。
Jouni K.Seppänen17年

741

如果您已经创建了图形,则可以快速执行以下操作:

fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5, 10.5)
fig.savefig('test2png.png', dpi=100)

要将大小更改传播到现有的GUI窗口,请添加 forward=True

fig.set_size_inches(18.5, 10.5, forward=True)

3
解决了我的问题imshow,现在我在使用消除绘图区域周围的空间后才使用此代码plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0)
heltonbiker

7
同样,您可以运行fig.set_dpi(100)
Erik Shilts,2015年

1
我正在OS X的ipython 3.7,matplotlib 3.0.3下使用它。我可以调整图形大小,但窗口不会调整大小(图形画布会调整,但窗口不会增大或缩小以适应画布)。forward = True关键字参数在此平台上似乎没有达到预期的效果。
K. Nielson

google colaboratory
carlosaar22

354

弃用说明:
根据官方Matplotlib指南pylab不再建议使用该模块。请考虑使用该matplotlib.pyplot模块,如该其他答案所述

以下似乎有效:

from pylab import rcParams
rcParams['figure.figsize'] = 5, 10

这使图形的宽度为5英寸,高度为10 英寸

然后,Figure类将其用作其参数之一的默认值。


3
在iPython笔记本的顶部(给--pylab = inline)已经在顶层导入了rcParam,这也可以很好地工作。
nealmcb 2013年

4
这在我的带有pyplot和Qt后端的OO接口的Windows计算机上不起作用。fig.set_size_inches(18.5, 10.5, forward=True)工作。
贝内特·布朗

2
当前在Meta
Mischa

对于Python版本:3.6.4,matplotlib:2.2.3,我认为您需要传递一个列表或元组,例如rcParams ['figure.figsize'] =(5,10)
史蒂夫·贡

2
有人知道为什么第一次运行单元时这种方法不起作用吗?
g07kore19年

314

使用plt.rcParams

如果您想在不使用图形环境的情况下更改大小,也可以使用此解决方法。因此,plt.plot()例如在使用时,可以设置宽度和高度的元组。

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,3)

当您以内联方式绘制时(例如,使用IPython Notebook),这非常有用。正如@asamaier所注意的那样,最好不要将此语句放在import语句的同一单元格中。

转换为厘米

figsize元组接受英寸所以,如果你想将其设置成你必须2.54分他们厘米,看一下这个问题


4
优秀的!对于一次设置和多次绘制也很有用。
自变

出于某种原因,它似乎在Jupyter笔记本中不再起作用(但曾经)。

@Ray您能写Jupyter笔记本的版本以及对我有用的行为吗
GM

@GM我上次测试时,是Windows 10和Google Chrome 63.0.3239.84上的Anaconda的Jupyter版本4.3.0和Python 3.6.2。

8
为了使其正常工作,我需要调用plt.rcParams["figure.figsize"] = (20,3)一个额外的单元格。当我在与import语句相同的单元格中调用它时,它将被忽略。
阿斯迈尔(Amaier)'18年

269

请尝试以下简单代码:

from matplotlib import pyplot as plt
plt.figure(figsize=(1,1))
x = [1,2,3]
plt.plot(x, x)
plt.show()

在绘制之前,需要设置图形尺寸。


14
这个答案告诉我,它是m atplotlib.pyplot.figure,其他人没有说清楚。我不断尝试之类的东西matplotlib.figurematplotlib.figure.Figure
林登·怀特

“ _tkinter.TclError:没有足够的可用内存用于图像缓冲区”
Cerin

5
plt.figure(figsize=(1,1))是关键所在。谢谢。
ximiki

在jupyter笔记本中,这对我有用:plt.figure(figsize =(20,10))
Abhishek Poojary,

对于使用jupyter笔记本的用户,请确保在其他plt命令之前使用plt.figure(figsize =(15,10))。
林宇航

89

如果您正在寻找一种方法来更改Pandas中的图形大小,可以执行例如:

df['some_column'].plot(figsize=(10, 5))

df熊猫数据框在哪里。或者,使用现有图形或轴

fig, ax = plt.subplots(figsize=(10,5))
df['some_column'].plot(ax=ax)

如果要更改默认设置,可以执行以下操作:

import matplotlib

matplotlib.rc('figure', figsize=(10, 5))

73

Google中的第一个链接'matplotlib figure size'AdjustingImageSize页面的Google缓存)。

这是上一页的测试脚本。它创建test[1-3].png同一图像的不同大小的文件:

#!/usr/bin/env python
"""
This is a small demo file that helps teach how to adjust figure sizes
for matplotlib

"""

import matplotlib
print "using MPL version:", matplotlib.__version__
matplotlib.use("WXAgg") # do this before pylab so you don'tget the default back end.

import pylab
import numpy as np

# Generate and plot some simple data:
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)

pylab.plot(x,y)
F = pylab.gcf()

# Now check everything with the defaults:
DPI = F.get_dpi()
print "DPI:", DPI
DefaultSize = F.get_size_inches()
print "Default size in Inches", DefaultSize
print "Which should result in a %i x %i Image"%(DPI*DefaultSize[0], DPI*DefaultSize[1])
# the default is 100dpi for savefig:
F.savefig("test1.png")
# this gives me a 797 x 566 pixel image, which is about 100 DPI

# Now make the image twice as big, while keeping the fonts and all the
# same size
F.set_size_inches( (DefaultSize[0]*2, DefaultSize[1]*2) )
Size = F.get_size_inches()
print "Size in Inches", Size
F.savefig("test2.png")
# this results in a 1595x1132 image

# Now make the image twice as big, making all the fonts and lines
# bigger too.

F.set_size_inches( DefaultSize )# resetthe size
Size = F.get_size_inches()
print "Size in Inches", Size
F.savefig("test3.png", dpi = (200)) # change the dpi
# this also results in a 1595x1132 image, but the fonts are larger.

输出:

using MPL version: 0.98.1
DPI: 80
Default size in Inches [ 8.  6.]
Which should result in a 640 x 480 Image
Size in Inches [ 16.  12.]
Size in Inches [ 16.  12.]

两个注意事项:

  1. 模块注释和实际输出不同。

  2. 通过此答案,可以轻松地将所有三个图像合并到一个图像文件中,以查看大小的差异。


7
每次我想回想如何做时,我都会写在这篇文章中。因此,这是我通常在寻找的代码:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk

45

您可以简单地使用(来自matplotlib.figure.Figure):

fig.set_size_inches(width,height)

从Matplotlib 2.0.0开始,对画布的更改将立即可见,因为forward关键字默认为True

如果您只想更改宽度高度而不是两者,则可以使用

fig.set_figwidth(val) 要么 fig.set_figheight(val)

这些也将立即更新您的画布,但仅限于Matplotlib 2.2.0和更高版本。

对于较旧的版本

您需要forward=True明确指定以便实时更新比上面指定的版本更早的画布。请注意,在Matplotlib 1.5.0之前的版本中,set_figwidthand set_figheight函数不支持该forward参数。


45
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(x,y) ## This is your plot
plt.show()

您还可以使用:

fig, ax = plt.subplots(figsize=(20, 10))

31

尝试注释掉该fig = ...

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2

fig = plt.figure(figsize=(18, 18))
plt.scatter(x, y, s=area, alpha=0.5)
plt.show()


16

要增加N倍的图形大小,您需要在pl.show()之前插入它:

N = 2
params = pl.gcf()
plSize = params.get_size_inches()
params.set_size_inches( (plSize[0]*N, plSize[1]*N) )

它也可以与ipython notebook一起很好地工作。


10

由于Matplotlib 本身无法使用公制,因此,如果要以合理的长度单位(例如厘米)指定图形的大小,则可以执行以下操作(来自gns-ank的代码):

def cm2inch(*tupl):
    inch = 2.54
    if isinstance(tupl[0], tuple):
        return tuple(i/inch for i in tupl[0])
    else:
        return tuple(i/inch for i in tupl)

然后,您可以使用:

plt.figure(figsize=cm2inch(21, 29.7))

8

即使在绘制图形之后,这也会立即调整图形的大小(至少使用带有matplotlib 1.4.0的Qt4Agg / TkAgg-但不使用MacOSX-):

matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)

7

概括和简化psihodelia的答案。如果您想将图形的当前大小更改一个因子sizefactor

import matplotlib.pyplot as plt

# here goes your code

fig_size = plt.gcf().get_size_inches() #Get current size
sizefactor = 0.8 #Set a zoom factor
# Modify the current size by the factor
plt.gcf().set_size_inches(sizefactor * fig_size) 

更改当前大小后,可能需要微调子图布局。您可以在图形窗口GUI中执行此操作,也可以通过命令subplots_adjust进行操作

例如,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)

5

另一种选择是在matplotlib中使用rc()函数(单位为英寸)

import matplotlib
matplotlib.rc('figure', figsize=[10,5])

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.