4.2 高级绘图

这一节将介绍几个Matplotlib的高级绘图功能,这些功能与图形和地图有关,然后在介绍其它几个常用的绘图包。

4.2.1 图像处理

一个彩色的NxM的图片可以表示为NxMx3的NumPy数组,如此一来,图像处理算法就可以由NumPy和SciPy实现,并由Matplotlib展现了。此外,PIL包(Python Imaging Library)实现了基本的图像处理算法。

读取图片

im = imread('squirrel.png')
im.shape
# (300L, 300L, 3L)

Matplotlib提供了imread,可加载PNG图片,如果安装了PIL,那么可以通过Image.open读取其它类型的图片,如JPEG、BMP、GID和TIFF等。

显示图片

使用imshow函数,借助于PIL可以做出更炫一点儿的功能:

imshow(array(img.rotate(45.)))

这里先将图片逆时针旋转45度,在显示出来。

高级图像处理 - 色彩量化(color quantization)

尽管PIL看起来已经有点儿高级了,但SciPy还有更高端的算法,比如色彩量化。

TODO

4.2.2 地图

地图是一种重要且复杂的图形。basemap包给Matplotlib带来了地理信息处理的能力。这里我们继续用cities数据集来绘制一个人口密度图。

import pandas as pd
data = pd.read_csv('worldcitiespop.txt', low_memory=False)
locations = data[['Longitude', 'Latitude']].as_matrix()
population = data.Population

from mpl_toolkits.basemap import Basemap
m = Basemap(projection='mill', llcrnrlat=-65, urcrnrlat=85, llcrnrlon=-180, urcrnrlon=180)
x, y = m(locations[:, 0], locations[:, 1])
x0, y0 = m(-180, -65)
x1, y1 = m(180, 85)
weights = population.copy()
weights[isnan(weights)] = 1000
h, _, _ = histogram2d(x, y, weights=weights, bins=(linspace(x0, x1, 500), linspace(y0, y1, 500)))
h[h == 0] = 1

import scipy.ndimage.filters
z = scipy.ndimage.filters.gaussian_filter(log(h.T), 1)
m.drawcoastlines()
m.imshow(z, origin='lower', extent=[x0, x1, y0, y1], cmap=get_cmap('Reds'))

4.2.3 3D图形

Matplotlib包含的3D绘图包mplot3d具有基本的3D绘图功能,这里给出一个简单的例子。

4.2.4 动画

Matplotlib能够创建动画,还可以将动画导出为MP4视频。更多信息在Matplotlib Animation API

4.2.5 其它可视化包

  • Chaco
  • PyQwt
  • PyQtGraph
  • Visvis
  • Mayavi
  • PyOpenGL
  • Galry