tat*_*ght 1726 python plot visualization graph matplotlib
你如何改变用matplotlib绘制的图形的大小?
Jou*_*nen 965
图告诉你呼叫签名:
from matplotlib.pyplot import figure
figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')
Run Code Online (Sandbox Code Playgroud)
figure(figsize=(1,1)) 会创建一个逐英寸的图像,除非你给出不同的dpi参数,否则它将是80×80像素.
Pet*_*ete 673
如果您已经创建了图形,则可以快速执行此操作:
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5, 10.5)
fig.savefig('test2png.png', dpi=100)
Run Code Online (Sandbox Code Playgroud)
要将大小更改传播到现有的gui窗口添加 forward=True
fig.set_size_inches(18.5, 10.5, forward=True)
Run Code Online (Sandbox Code Playgroud)
        tat*_*ght 318
弃用说明:
根据官方Matplotlib指南,pylab不再推荐使用该模块.请考虑使用该matplotlib.pyplot模块,如其他答案所述.
以下似乎有效:
from pylab import rcParams
rcParams['figure.figsize'] = 5, 10
Run Code Online (Sandbox Code Playgroud)
这使得图形的宽度为5英寸,高度为10 英寸.
然后,Figure类将其用作其中一个参数的默认值.
G M*_*G M 245
如果您想在不使用图形环境的情况下更改大小,也可以使用此解决方法.因此,如果您正在使用plt.plot(),例如,您可以设置具有宽度和高度的元组.
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,3)
Run Code Online (Sandbox Code Playgroud)
当您内联绘图时(例如使用IPython Notebook),这非常有用.正如@asamaier注意到你最好不要将这个语句放在imports语句的同一个单元格中.
该figsize元组接受英寸所以,如果你想将其设置成你必须2.54分他们厘米,看一下这个问题.
小智 241
请尝试以下简单代码:
from matplotlib import pyplot as plt
plt.figure(figsize=(1,1))
x = [1,2,3]
plt.plot(x, x)
plt.show()
Run Code Online (Sandbox Code Playgroud)
您需要在绘图前设置图形大小.
Kri*_*ris 70
如果您正在寻找一种方法来改变Pandas中的数字大小,您可以这样做:
df['some_column'].plot(figsize=(10, 5))
Run Code Online (Sandbox Code Playgroud)
哪里df是Pandas数据帧.如果要更改默认设置,可以执行以下操作:
fig, ax = plt.subplots(figsize=(10,5))
df['some_column'].plot(ax=ax)
Run Code Online (Sandbox Code Playgroud)
        jfs*_*jfs 69
Google for的第一个链接'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.
Run Code Online (Sandbox Code Playgroud)
输出:
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.]
Run Code Online (Sandbox Code Playgroud)
两个笔记:
模块注释和实际输出不同.
此答案可以轻松地将所有三个图像组合在一个图像文件中,以查看大小的差异.
Riv*_*ver 42
你可以简单地使用(来自matplotlib.figure.Figure):
fig.set_size_inches(width,height)
Run Code Online (Sandbox Code Playgroud)
从Matplotlib 2.0.0开始,对于画布的更改将立即可见,因为forward关键字默认为True.
如果您只想更改宽度或高度而不是两者,您可以使用
fig.set_figwidth(val) 要么 fig.set_figheight(val)
这些也会立即更新您的画布,但仅限于Matplotlib 2.2.0及更高版本.
您需要forward=True明确指定,以便在早于上面指定的版本中实时更新画布.请注意,set_figwidth和set_figheight函数不支持forward早于Matplotlib 1.5.0的版本中的参数.
Ren*_*aud 30
尝试评论该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()
Run Code Online (Sandbox Code Playgroud)
        ama*_*205 26
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(x,y) ## This is your plot
plt.show()
Run Code Online (Sandbox Code Playgroud)
您还可以使用:
fig, ax = plt.subplots(figsize=(20, 10))
Run Code Online (Sandbox Code Playgroud)
        psi*_*lia 15
要增加图形的大小N次,您需要在pl.show()之前插入它:
N = 2
params = pl.gcf()
plSize = params.get_size_inches()
params.set_size_inches( (plSize[0]*N, plSize[1]*N) )
Run Code Online (Sandbox Code Playgroud)
它也适用于ipython笔记本.
lov*_*sus 15
概括和简化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) 
Run Code Online (Sandbox Code Playgroud)
更改当前大小后,可能需要对子图布局进行微调。您可以在图形窗口 GUI 中执行此操作,或通过命令subplots_adjust
例如,
plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)
Run Code Online (Sandbox Code Playgroud)
        Cir*_*四事件 15
以像素为单位设置精确图像大小的不同方法的比较
本回答将重点关注:
savefig: 如何保存到文件,而不仅仅是显示在屏幕上这是我尝试过的一些方法的快速比较,图像显示了所提供的内容。
没有尝试设置图像尺寸的基线示例
只是有一个比较点:
基础文件
#!/usr/bin/env python3
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
fig, ax = plt.subplots()
print('fig.dpi = {}'.format(fig.dpi))
print('fig.get_size_inches() = ' + str(fig.get_size_inches())
t = np.arange(-10., 10., 1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0., 60., 'Hello', fontdict=dict(size=25))
plt.savefig('base.png', format='png')
Run Code Online (Sandbox Code Playgroud)
跑:
./base.py
identify base.png
Run Code Online (Sandbox Code Playgroud)
输出:
fig.dpi = 100.0
fig.get_size_inches() = [6.4 4.8]
base.png PNG 640x480 640x480+0+0 8-bit sRGB 13064B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
迄今为止我最好的方法:plt.savefig(dpi=h/fig.get_size_inches()[1]仅高度控制
我认为这是我大部分时间都会采用的方法,因为它很简单且可扩展:
获取大小.py
#!/usr/bin/env python3
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
height = int(sys.argv[1])
fig, ax = plt.subplots()
t = np.arange(-10., 10., 1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0., 60., 'Hello', fontdict=dict(size=25))
plt.savefig(
    'get_size.png',
    format='png',
    dpi=height/fig.get_size_inches()[1]
)
Run Code Online (Sandbox Code Playgroud)
跑:
./get_size.py 431
Run Code Online (Sandbox Code Playgroud)
输出:
get_size.png PNG 574x431 574x431+0+0 8-bit sRGB 10058B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
和
./get_size.py 1293
Run Code Online (Sandbox Code Playgroud)
输出:
main.png PNG 1724x1293 1724x1293+0+0 8-bit sRGB 46709B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
我倾向于只设置高度,因为我通常最关心图像将在我的文本中间占据多少垂直空间。
plt.savefig(bbox_inches='tight' 更改图像大小
我总觉得图像周围有太多的空白,并倾向于添加bbox_inches='tight':
 Removing white space around a saved image in matplotlib
但是,这是通过裁剪图像来实现的,并且您将无法获得所需的尺寸。
相反,在同一问题中提出的另一种方法似乎效果很好:
plt.tight_layout(pad=1)
plt.savefig(...
Run Code Online (Sandbox Code Playgroud)
这给出了高度等于 431 的确切所需高度:
固定高度,set_aspect自动调整宽度和小边距
嗯,set_aspect又把事情搞砸了,并防止plt.tight_layout实际删除边距......
问:如何在 Matplotlib 中获得固定高度(以像素为单位)、固定数据 x/y 纵横比并自动删除删除水平空白边距?
plt.savefig(dpi=h/fig.get_size_inches()[1] + 宽度控制
如果您确实需要除高度之外的特定宽度,这似乎可以正常工作:
宽度.py
#!/usr/bin/env python3
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
h = int(sys.argv[1])
w = int(sys.argv[2])
fig, ax = plt.subplots()
wi, hi = fig.get_size_inches()
fig.set_size_inches(hi*(w/h), hi)
t = np.arange(-10., 10., 1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0., 60., 'Hello', fontdict=dict(size=25))
plt.savefig(
    'width.png',
    format='png',
    dpi=h/hi
)
Run Code Online (Sandbox Code Playgroud)
跑:
./width.py 431 869
Run Code Online (Sandbox Code Playgroud)
输出:
width.png PNG 869x431 869x431+0+0 8-bit sRGB 10965B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
对于小宽度:
./width.py 431 869
Run Code Online (Sandbox Code Playgroud)
输出:
width.png PNG 211x431 211x431+0+0 8-bit sRGB 6949B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
所以看起来字体缩放正确,我们只是在非常小的宽度上遇到一些麻烦,标签被切断,例如100左上角。
我设法解决了在 matplotlib 中删除已保存图像周围的空白的问题
plt.tight_layout(pad=1)
Run Code Online (Sandbox Code Playgroud)
这使:
width.png PNG 211x431 211x431+0+0 8-bit sRGB 7134B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
由此,我们也看到tight_layout删除了图像顶部的很多空白区域,所以我通常总是使用它。
固定魔法基础高度、dpi开启fig.set_size_inches和plt.savefig(dpi=缩放
我相信这等同于提到的方法:https : //stackoverflow.com/a/13714720/895245
魔法.py
#!/usr/bin/env python3
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
magic_height = 300
w = int(sys.argv[1])
h = int(sys.argv[2])
dpi = 80
fig, ax = plt.subplots(dpi=dpi)
fig.set_size_inches(magic_height*w/(h*dpi), magic_height/dpi)
t = np.arange(-10., 10., 1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0., 60., 'Hello', fontdict=dict(size=25))
plt.savefig(
    'magic.png',
    format='png',
    dpi=h/magic_height*dpi,
)
Run Code Online (Sandbox Code Playgroud)
跑:
./magic.py 431 231
Run Code Online (Sandbox Code Playgroud)
输出:
magic.png PNG 431x231 431x231+0+0 8-bit sRGB 7923B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
并查看它是否可以很好地扩展:
./magic.py 1291 693
Run Code Online (Sandbox Code Playgroud)
输出:
magic.png PNG 1291x693 1291x693+0+0 8-bit sRGB 25013B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
所以我们看到这种方法也很有效。我遇到的唯一问题是您必须设置该magic_height参数或等效参数。
固定 DPI + set_size_inches
这种方法给出了一个稍微错误的像素大小,并且很难无缝地缩放所有东西。
set_size_inches.py
#!/usr/bin/env python3
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
w = int(sys.argv[1])
h = int(sys.argv[2])
fig, ax = plt.subplots()
fig.set_size_inches(w/fig.dpi, h/fig.dpi)
t = np.arange(-10., 10., 1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(
    0,
    60.,
    'Hello',
    # Keep font size fixed independently of DPI.
    # /sf/ask/2757693151/
    fontdict=dict(size=10*h/fig.dpi),
)
plt.savefig(
    'set_size_inches.png',
    format='png',
)
Run Code Online (Sandbox Code Playgroud)
跑:
./set_size_inches.py 431 231
Run Code Online (Sandbox Code Playgroud)
输出:
set_size_inches.png PNG 430x231 430x231+0+0 8-bit sRGB 8078B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
所以高度稍微偏离了,图像:
如果我把它放大 3 倍,像素大小也是正确的:
./set_size_inches.py 1291 693
Run Code Online (Sandbox Code Playgroud)
输出:
set_size_inches.png PNG 1291x693 1291x693+0+0 8-bit sRGB 19798B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
但是我们从中了解到,要使这种方法很好地缩放,您需要使每个 DPI 相关设置与以英寸为单位的大小成比例。
在前面的示例中,我们只使“Hello”文本成比例,并且它的高度确实保持在我们预期的 60 到 80 之间。但是我们没有这样做的所有东西看起来都很小,包括:
SVG
我找不到如何为 SVG 图像设置它,我的方法只适用于 PNG 例如:
get_size_svg.py
#!/usr/bin/env python3
import sys
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
height = int(sys.argv[1])
fig, ax = plt.subplots()
t = np.arange(-10., 10., 1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0., 60., 'Hello', fontdict=dict(size=25))
plt.savefig(
    'get_size_svg.svg',
    format='svg',
    dpi=height/fig.get_size_inches()[1]
)
Run Code Online (Sandbox Code Playgroud)
跑:
./get_size_svg.py 431
Run Code Online (Sandbox Code Playgroud)
生成的输出包含:
<svg height="345.6pt" version="1.1" viewBox="0 0 460.8 345.6" width="460.8pt"
Run Code Online (Sandbox Code Playgroud)
并确定 说:
get_size_svg.svg SVG 614x461 614x461+0+0 8-bit sRGB 17094B 0.000u 0:00.000
Run Code Online (Sandbox Code Playgroud)
如果我在 Chromium 86 中打开它,浏览器调试工具鼠标图像悬停确认高度为 460.79。
但是当然,由于 SVG 是矢量格式,所以理论上一切都应该按比例缩放,因此您可以转换为任何固定大小的格式而不会损失分辨率,例如:
inkscape -h 431 get_size_svg.svg -b FFF -e get_size_svg.png
Run Code Online (Sandbox Code Playgroud)
给出确切的高度:
我convert在这里使用 Inkscape 而不是 Imagemagick ,因为您还需要-density使用 ImageMagick 来获得清晰的 SVG 调整大小:
<img height=""HTML 上的设置也应该只适用于浏览器。
在 matplotlib==3.2.2 上测试。
小智 13
用这个:
plt.figure(figsize=(width,height))
Run Code Online (Sandbox Code Playgroud)
该width和height为英寸。如果未提供,则默认为rcParams["figure.figsize"] = [6.4, 4.8]。在此处查看更多信息。
Sha*_*han 12
下面将一定的工作,但要确保你添加行plt.figure(figsize=(20,10))上面plt.plot(x,y),plt.pie()等等。
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(x,y) ## This is your plot
plt.show()
Run Code Online (Sandbox Code Playgroud)
该代码是从 amalik2205复制的。
这适合我:
from matplotlib import pyplot as plt
F = gcf()
Size = F.get_size_inches()
F.set_size_inches(Size[0]*2, Size[1]*2, forward=True)#Set forward to True to resize window along with plot in figure.
plt.show() #or plt.imshow(z_array) if using an animation, where z_array is a matrix or numpy array
Run Code Online (Sandbox Code Playgroud)
这也可能有所帮助:http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html
因为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)
Run Code Online (Sandbox Code Playgroud)
然后你可以使用:
plt.figure(figsize=cm2inch(21, 29.7))
Run Code Online (Sandbox Code Playgroud)
        另一种选择是使用 Matplotlib 中的 rc() 函数(单位是英寸):
import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Run Code Online (Sandbox Code Playgroud)
        即使在绘制图形之后,这也会立即调整大小(至少使用Qt4Agg/TkAgg - 但不是MacOSX - 使用matplotlib 1.4.0):
matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)
Run Code Online (Sandbox Code Playgroud)
        小智 7
这就是我使用自定义大小打印自定义图形的方式
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
figure(figsize=(16, 8), dpi=80)
plt.plot(x_test, color = 'red', label = 'Predicted Price')
plt.plot(y_test, color = 'blue', label = 'Actual Price')
plt.title('Dollar to PKR Prediction')
plt.xlabel('Predicted Price')
plt.ylabel('Actual Dollar Price')
plt.legend()
plt.show()
           
Run Code Online (Sandbox Code Playgroud)
        当创建一个新的人物,你可以指定尺寸(英寸)与figsize参数:
Run Code Online (Sandbox Code Playgroud)import matplotlib.pyplot as plt fig = plt.figure(figsize=(w,h))
如果要修改现有图形,请使用以下set_size_inches()方法:
Run Code Online (Sandbox Code Playgroud)fig.set_size_inches(w,h)
如果要更改默认图形大小 (6.4" x 4.8"),请使用“运行命令” rc:
Run Code Online (Sandbox Code Playgroud)plt.rc('figure', figsize=(w,h))
我通常更关心高度/宽度的相对大小,而不是以英寸为单位的实际值。所以,我用来plt.figaspect()设置纵横比。
# Make the image 3x as wide as it is tall
fix, ax = plt.subplots(figsize=plt.figaspect(1/3))
plt.title("I'm 3x as wide as I am tall")
plt.show()
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2244872 次  |  
        
|   最近记录:  |