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 图像而言。

MPL_size_test.py

In [ ]
#!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 像素的边框。

解决方案不是特别面向对象,但至少它能解决实际问题。

In [ ]
#!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

附件