Matplotlib
matplotlib 提供了一整套和Matlab相似的命令API,十分适合交互式地进行绘图。而且也可以方便的将它最为绘图控件,嵌入GUI应用中。matplotlib可以绘制多种形式的图包括普通的线图,直方图,饼图,散点图以及误差曲线等;可以比较方便的定制图形的各种属性不如图线的颜色,粗细,字体的大小等,它能够很好地支持一部分TeX排版命令,可以美观的显示图中的数学公式
1 pylab介绍
matplotlib种包含几十个不同的模块,如matlob,mathtext,finance,dates等,而pylab则是其中最常用的模块
1.0 设置图片渲染途径
IPython 支持两种形式的绘图
终端输出图像
新窗口输出图像
方式 1 能够非常方便的保存输出记录(如将`IPython 终端输出转换成 Html 文件)
方式 2 则可以交互式的放大、拖动图片,并且能将图片保存成不同的格式
在终端窗口中输出图片的命令是:
%matplotlib inline
在图片窗口表现图片的命令是:
%matplotlib qt
设置是持久有效的, 除非重新设置, 在图片show之前设置皆可
1.1 中文显示问题解决方案
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像时‘-’显示为方块的问题
1.2绘制最简单的图形
import numpy as np
import matplotlib.pyplot as plt
#plt.rcParams['figure.dpi'] = 100 #分辨率
plt.rcParams['figure.dpi'] = 100 #分辨率
x = np.arange(0, 2 * np.pi, 0.01)
y = np.sin(x)
plt.plot(x, y)
plt.show()
1.3 设置标题、坐标名称、坐标轴范围
如果在python的shell中运行下面的代码,而shell的默认编码不是utf-8的话,中文可能仍然会显示为乱码。可以尝试把u’正弦曲线’。decode(‘gbk’) 或者’正弦曲线’.decode(‘utf-8’)
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)
plt.plot(x, y)
plt.title(u'正弦曲线', fontdict={'size':20}) # 设置标题
plt.xlabel(u'弧度', fontdict={'size':16}) # 显示横轴名称
plt.ylabel(u'正弦值',fontdict={'size':16}) # 显示纵轴名称
plt.axis([-0.1*np.pi, 2.1*np.pi, -1.1, 1.1]) # 设置坐标轴范围
plt.show()
1.4 设置点和线的样式、宽度、颜色
plt.plot函数的调用形式如下:
plot(x, y, color="green", linestyle="dashed", linewidth=1, marker='o', markerfacecolor='blue', markersize=6)
plot(x, y, c='g', ls='---', lw=1, marker='o', mfc='blue', ms=6)
- color 指定线的颜色, 可简写为‘c’。颜色的选项为:
- 蓝色 ‘b’
- 绿色 ‘g’
- 红色 ‘r’
- 墨绿 ‘c’
- 洋红 ‘m’
- 黄色 ‘y’
- 黑色 ‘k’
- 白色 ‘w’
- 灰度表示 e.g. 0.75([0, 1]内的任意浮点数)
- RGB表示法 e.g. ‘#2F4F4F’ 或 (0.18, 0.31, 0.31)
- linestyle 指定线型, 可简写为’ls’
- 实线: ‘-’
- 虚线: ‘–’
- 虚点线: ‘-.’
- 点线:‘:’
- 无: ‘’或‘None’
- linewidth 指定线的宽度, 可简写为’lw’
- marker 描述数据点的形状
- 点线 ‘.’
- 点线 ‘o’
- 加号 ‘+’
- 叉号 ‘x’
- 上三角 ‘^’
- 上三角 ‘v’
- markerfacecolor 指定数据点标记的表面颜色, 可简写为 ‘mfc’
- markersize 指定数据点标记的大小, 可简写为‘ms’
1.5 文本标注和图例
我们使用不同的线形、颜色来绘制以10、e、2为基的一组幂函数曲线,颜色文本标注和图例的使用
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
x = np.linspace(-4, 4, 200)
f1 = np.power(10, x)
f2 = np.power(np.e, x)
f3 = np.power(2, x)
plt.plot(x, f1, 'r', ls='-', lw=2, label="$10^x$")
plt.plot(x, f2, 'b', ls='--', lw=2, label='$e^x$')
plt.plot(x, f3, 'g', ls=':', lw=2, label='$2^x$')
plt.axis([-4, 4, -0.5, 8])
plt.text(1, 7.5, r'$10^x$', fontsize=16)
plt.text(2.2, 7.5, r'$e^x$', fontsize=16)
plt.text(3.2, 7.5, r'$2^x$', fontsize=16)
plt.title("幂函数曲线", fontsize=16)
plt.legend(loc='upper left')
plt.show()
2 绘制多轴图
在介绍如何将多福子图绘制在一个画板的同时, 顺便演示如何绘制直线和矩形。我们可以使用subplot函数快速绘制多个轴的图表。subplot函数的调用形式如下
subplot(numRows, numCols, plotNum)
subplot 将整个绘图区域等分为numRows行*numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNUm这三个数都小于10的话,可以把他们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将会被删除。
import matplotlib.pyplot as plt
plt.subplot(221) # 两行两列的第一个位置
plt.axis([-1, 2, -1, 2])
plt.axhline(y=0.5, color='b')
plt.axhline(y=0.5, xmin=0.25, xmax=0.75, color='r')
plt.subplot(222) # 两行两列的第二个位置
plt.axis([-1, 2, -1, 2])
plt.axvline(x=0, ymin=0, lw=4, c='r')
plt.axvline(x=1.0, ymin=-0.5, ymax=0.5, lw=4, c='g')
plt.subplot(212) # 两行一列的第二个位置
plt.axis([-1, 2, -1, 2])
plt.axvspan(1.25, 1.55, fc='g', alpha=0.5)
plt.axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5)
plt.show()
3 常用;绘图类型
3.1 直方图
用numpy随机生成一个符合正态分布的数据集,统计分段区域内数据的个数
import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(5.0, 3.0, 1000)
plt.hist(data)
bins = np.arange(-5, 16, 1)
plt.hist(data, bins) # 使用自定义的分段区域
plt.show()
3.2 散点图
使用plot() 绘图时,如果指定样式参数为仅绘制数据点(linesytle=’None’), 那么所绘制的图为一幅散列图。这种方法所绘制的点无法单独指定数据点的颜色和大小,而使用scatter()绘制的散列图可以指定每个点的颜色和大小
plt.scatter函数的调用形式如下:
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, data=None, **kwargs)
- x ,y两个参数是数组, 分别指定每个点的X轴和Y轴坐标。
- s参数指定点的大小,值和点的面积成正比,它可以是一个数,指定所有点的大小, 也可以是数组分别指定每个点的大小。
- c参数指定每个点的颜色,可以是数值或数组。这里使用一维数组为每个点指定一个数值。通过颜色映射表,每个值都会与一个颜色相对应。默认的颜色映射表中蓝色与最小值相对应,红色与最大值对应。当c参数的形状是(N, 3)或(N, 4)的二维数组时则直接表示每个点的RGB颜色。
- marker参数设置点的形状,可以是表示形状的字符串,也可以是表示多边形的两个元素的元组, 第一个元素表示多边形的边数,第二个参数表示多边形的样式,取值范围为0、1、2、3。0表示多边形,1表示星形,2表示放射形,3表示忽略边数显示为圆形。
- alpha参数设置点的透明度。
- facecolors参数为‘none’时表示散列点没有填充色
import numpy as np
import matplotlib.pyplot as plt
x = np.random.rand(50)
y = np.random.rand(50)
area = np.pi * (15 * np.random.rand(50)) ** 2
color = 2 * np.pi * np.random.rand(50)
plt.scatter(x, y, s=area, c=color, alpha=0.5, cmap=plt.cm.hsv)
plt.show()
3.3 梯形图、柱状图、填充图
import numpy as np
import matplotlib.pyplot as plt
n = np.array([0, 1, 2, 3, 4, 5])
x = np.linspace(-0.75, 1., 100)
plt.subplot(131)
plt.step(n, n**2, lw=2) # 梯形图
plt.subplot(132)
plt.bar(n, n**2, align='center', width=0.5, alpha=0.5) # 柱状图
plt.subplot(133)
plt.fill_between(x, x**2, x**3, color="green", alpha=0.5) # 填充图
plt.show()
3.4 对数坐标
plot()所绘制图表的X-Y轴都是算数坐标。绘制对数坐标图的函数有三个:semilogx()、semilogy()和loglog(),他们分别绘制X轴为对数坐标、Y为对数坐标以及两个轴都为对数坐标时的图表。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 3, 100)
y = np.power(2, np.power(2, x))
plt.subplot(121)
plt.semilogy(x, y, '-r')
plt.subplot(122)
plt.plot(x, y, '--g')
plt.show()
3.5 极坐标绘图
极坐标系和笛卡尔(X-Y)坐标系完全不同的坐标系,极坐标系中的点由一个夹角和一段相对中心点的距离来表示。polar(theta, r, **kwargs)可以直接创建极坐标子图并在其中绘制曲线。也可以使用程序中调用subplot()创建子图时通过polar参数为True,创建一个极坐标子图,然后调用plot()在极坐标中绘图
import numpy as np
import matplotlib.pyplot as plt
theta = np.arange(0, 2*np.pi, 0.02)
plt.polar(theta, 1.4*np.cos(5*theta), '--', lw=2)
plt.polar(theta, 1.8*np.cos(4*theta), lw=2, color='g')
plt.show()
plt.subplot(111, polar=True)
plt.plot(theta, 1.4*np.cos(5*theta), ':', lw=2, )
plt.show()
4 2D绘图
4.1 等值线图
所谓等值线,是指由函数值相等的各点练成的平滑曲线。等值线可以直观的表示二元函数值的变化趋势,例如等值线密集的地方表示函数值在此处的变化较大。matplotlib中可以使用contour()和contourf()绘制等值线,他们的区别是:contourf()所得到的时带填充效果的等值线
import numpy as np
import matplotlib.pyplot as plt
y, x = np.ogrid[-2:2:200j, -3:3:300j]
z = x * np.exp(- x**2 - y**2)
extent = [np.min(x), np.max(x), np.min(y), np.max(y)]
plt.subplot(121)
cs = plt.contour(z , 10, extent=extent, cmap=plt.cm.cool)
plt.clabel(cs) # 添加等值线的值
plt.subplot(122)
plt.contourf(x.reshape(-1), y.reshape(-1), z, 20, cmap=plt.cm.hot)
plt.show()
- 为了更清楚地区分X轴和Y轴,这里让他们的取证范围和等分次数均不相同。这样得到的数组Z的形状为(200, 300), 他的第0轴对应Y轴, 第1轴对应X轴。
- 调用contour()绘制数组z的等值线图,第二个参数为10,表示将整个函数的取值方位分为10个区间,即显示的等值线图中将有9条等值线图。可以使用extent参数指定等值线图的X轴和Y轴的数据范围。
- contour()所返回的是一个QuadContourSet对象,将他传给clabel(), 为其中的等值线标上对应的值。
- 调用contourf(),绘制将取值范围分为20份、带填充效果的等值线图。这里演示了另一种设置X,Y轴取值范围的方法,他的前两个参数分别是计算数组z时所使用的X轴Y轴上的取样点,这两个数组必须是一维的。
4.2 二维数据的平面色彩显示
import numpy as np
import matplotlib.pyplot as plt
data = np.clip(np.random.randn(5, 5), -1, 1)
plt.subplot(221)
plt.imshow(data)
plt.subplot(222)
plt.imshow(data, cmap=plt.cm.cool)
plt.subplot(223)
plt.imshow(data, cmap=plt.cm.hot)
plt.colorbar() # 显示显色对应的数据的指示条
plt.subplot(224)
plt.imshow(data, cmap=plt.cm.winter)
plt.colorbar(im, cmap=plt.cm.winter, ticks=[-1, 0, 1])
plt.show()
5 3D绘图
虽然matplotlib主要专注于绘图,并且主要是二维图形,但它也有一些不同的拓展,能让我们在地理图上绘图,让我们把Excel和3D图表结合起来。在matplotlib的世界里,这样的拓展叫工具包(toolkits)。工具包是一些关注在某个话题(如3D绘图)的特定函数的集合。
比较流行的工具包由Basemap、GTK工具、Excel工具、Natgrid、AxesGrid和mplot3d。
mpl_toolkits.mplot3工具包提供了一些基本的3D绘图功能,能支持的图表类型包括散点图(scatter)、曲面图(surf)、线图(line)和网格图(mesh)。虽然mplot3d不是一个最好的绘图库,但他是伴随matplotlib产生的,一次我们对其接口已经很熟悉了。
下面是一个使用plot_surface绘制3d曲面图的例子
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
x, y = np.mgrid[-2:2:50j, -2:2:50j]
z = x*np.exp(-x**2-y**2)
ax = plt.subplot(111, projection='3d')
ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap=plt.cm.coolwarm, alpha=0.8)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
写个博客不容易,可怜可怜博主,点个广告再走呗(✿◕‿◕✿)。