Matplotlib:调整图像大小¶
日期 | 2011-09-23(最后修改),2006-01-22(创建) |
---|
======================================================================
这是一个小型演示文件,有助于教授如何调整 Matplotlib 的图形大小
首先介绍一下¶
有三个参数定义图像大小(这与 MPL 无关):¶
* 长度单位尺寸(英寸、厘米、磅等):例如 5"x7"
\ * 像素尺寸:例如 800x600 像素
\ * 每英寸点数 (dpi) 例如 100 dpi
只有两个是独立的,所以如果你定义了两个,第三个可以从其他两个计算出来。
在计算机屏幕上显示(或保存为 PNG)时,长度单位尺寸无关紧要,像素只是简单地显示。当打印或保存为 PS、EPS 或 PDF(所有这些都设计为支持打印)时,则使用尺寸或 dpi 来确定如何缩放图像。
现在我将深入了解 MPL 的工作原理¶
. 1) 图形的尺寸以长度单位(英寸)定义,可以通过
\ . 2) 图形的布局以“图形单位”定义,以便在更改图形尺寸时,布局(例如轴位置)会更新。
\ . 3) 文本大小、线条宽度等以长度单位(点?)定义。
\ . 4) 在显示到屏幕或创建图像(PNG)时,文本和线条宽度的像素大小等由 dpi 设置决定,该设置由
这里的诀窍是,在打印时,自然会以英寸为单位思考,但在创建图像(例如网页)时,自然会以像素大小为单位思考。但是,从 0.84 版本开始,像素大小只能在 GTK* 后端中使用 canvas.resize(w,h) 方法直接设置。(请记住,你只能设置三个尺寸参数中的两个,第三个必须根据另外两个计算得出)。
另一个技巧¶
Figure.savefig() 会覆盖图形中的 dpi 设置,并使用默认值(在我的系统上至少为 100 dpi)。如果你想覆盖它,可以在 savefig 调用中指定“dpi”。
以下代码将有助于使这一点更加清晰,至少对于生成用于网页等的 PNG 图像而言。
#!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 matplotlib.numerix as N
# Generate and plot some simple data:
x = N.arange(0, 2*N.pi, 0.1)
y = N.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_figsize_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_figsize_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.
在图形中放置多个图像¶
假设你有两个图像:100x100 和 100x50,你想在一个图形中显示它们,并在它们之间留出 20 像素的缓冲区(相对于图像像素),并在周围留出 10 像素的边框。
解决方案不是特别面向对象,但至少它能解决实际问题。
#!python
def _calcsize(matrix1, matrix2, top=10, left=10, right=10, bottom=10, buffer=20, height=4, scale = 1.):
size1 = array(matrix1.shape) * scale
size2 = array(matrix2.shape) * scale
_width = float(size1[1] + size2[1] + left + right + buffer)
_height = float(max(size1[0], size2[0]) + top + bottom)
x1 = left / _width
y1 = bottom / _height
dx1 = size1[1] / _width
dy1 = size1[0] / _height
size1 = (x1, y1, dx1, dy1)
x2 = (size1[1] + left + buffer) / _width
y2 = bottom / _height
dx2 = size2[1] / _width
dy2 = size2[0] / _height
size2 = (x2, y2, dx2, dy2)
figure = pylab.figure(figsize=(_width * height / _height, height))
axis1 = apply(pylab.axes, size1)
pylab.imshow(X1, aspect='preserve')
axis2 = apply(pylab.axes, size2)
pylab.imshow(X2, aspect='preserve')
return axes1, axes2, figure
章节作者:AndrewStraw、MartinSpacek、Unknown[75]、TimSwast
附件