各种图件
1. 线形图与散点图
1.1 线形图
plt.plot()
函数:
color
参数——如果不显式指定颜色,Matplotlib就会为多条线自动循环使用一组默认的颜色:linestyle
参数结合
color
和linestyle
的编码这些单字符颜色代码是RGB(Red/Green/Blue)与CMYK(Cyan/Magenta/Yellow/blacK)颜色系统中的标准缩写形式,通常用于数字化彩色图形。
plt.plot(x, x + 0, '-g') # 绿色实线 plt.plot(x, x + 1, '--c') # 青色虚线 plt.plot(x, x + 2, '-.k') # 黑色点划线 plt.plot(x, x + 3, ':r') # 红色实点线
plt.plot()
函数可一次性创建多条线,返回线条实例列表。
调整坐标轴的plt.xlim()
、plt.ylim()
函数:
常规示例:
plt.plot(x, np.sin(x)) plt.xlim(-1, 11) plt.ylim(-1.5, 1.5)
若要让坐标轴逆序显示,可以逆序设置坐标轴刻度值:
plt.plot(x, np.sin(x)) plt.xlim(10, 0) plt.ylim(1.2, -1.2)
调整坐标的plt.axis()
函数:
用
plt.axis()
函数通过传入[xmin, xmax, ymin, ymax]
对应的值,即可用一行代码设置x和y的限值plt.axis()
还可以设置tight
关键字使图形内容自动收紧于坐标轴,不留空白区域;使用equal
关键字使屏幕上显示的图形分辨率为1:1,x轴单位长度与y轴单位长度相等。plt.plot(x, np.sin(x)) plt.axis('tight')
plt.plot(x, np.sin(x)) plt.axis('equal')
设置图形标签:
操作 | 示例 | 说明 |
---|---|---|
plt.title() | plt.title('A Sine Curve') | 设置图形标题 |
plt.xlabel() | plt.xlabel('x') | 设置x轴标签 |
plt.ylabel() | plt.ylabel('y') | 设置y轴标签 |
plt.legend() | plt.legend() | 显示图例 |
plt.plot() 的label参数 | plt.plot(x, np.sin(x), '-g', label='sin(x)') | 单独设置曲线标签 |
1.2 散点图
用
plt.plot()
画散点:图片 说明 函数的第三个参数是一个字符,表示图形符号的类型 还可以与线条、颜色代码组合起来,画出一条连接散点的线 plt.plot()支持许多设置线条和散点属性的参数 用
plt.scatter()
画散点图:其用法与
plt.plot()
函数类似。两者的主要差别在于,前者在创建散点图时具有更高的灵活性,可以单独控制每个散点与数据匹配,也可以让每个散点具有不同的属性(大小、表面颜色、边框颜色等)。此图使散点的大小以像素为单位。这样,散点的颜色与大小就可以在可视化图中显示多维数据的信息了。
在数据量较小的时候,两者在效率上的差异不大。但是当数据变大到几千个散点时,
plt.plot()
的效率将大大高于plt.scatter()
。
2. 密度图与等高线图
所用函数:
函数 | 语法 | 说明 |
---|---|---|
plt.contour() | 需三个参数:x 轴、y 轴、z 轴三个坐标轴的网格数据。x 轴与 y 轴表示图形中的位置,而 z 轴将通过等高线的等级来表示。 | 画等高线图 |
plt.contourf() | 语法同plt.contour() | 画带有填充色的等高线图 |
plt.imshow() | 显示图形 |
用np.meshgrid()
函数可以从一维数组构建二维网格数据:
x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)

在用 plt.contour()
函数画图时,当图形中只使用一种颜色时,默认使用虚线表示负数,使用实线表示正数。还可以用 cmap
参数设置一个线条本色方案来自定义颜色。
plt.contour(X, Y, Z, 20, cmap='RdGy')

这里使用 RdGy(红-灰,Red-Gray 的缩写)配色方案。
使用 plt.contourf()
函数来填充等高线图,并用 plt.colorbar()
自动创建一个表示图形各种颜色对应标签信息的颜色条:

通过 plt.imshow()
函数可以将二维数组渲染成渐变图:
plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', cmap='RdGy')
plt.colorbar()
plt.axis(aspect='image')

plt.imshow()
函数有一些注意事项:
plt.imshow
不支持用 x 轴和 y 轴数据设置网格,而是必须通过extent
参数设置图形的坐标范围[xmin, xmax, ymin, ymax]
plt.imshow
默认使用标准的图形数组定义,就是原点位于左上角(浏览器都是如此),而不是绝大多数等高线图中使用的左下角,这一点在显示网格数据图形的时候必须调整plt.imshow
会自动调整坐标轴的精度以适应数据显示,可以通过plt.axis(aspect='image')
来设置 x 轴与 y 轴的单位。
可将等高线图与彩色图组合起来。用一幅背景色半透明的彩色图,与另一幅坐标轴相同、带数据标签的等高线图用 plt.clabel()
函数叠放在一起:
contours = plt.contour(X, Y, Z, 3, colors='black')
plt.clabel(contours, inline=True, fontsize=8)
plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', cmap='RdGy', alpha=0.5)
plt.colorbar()

将 plt.contour(), plt.contourf(), plt.imshow()
这三个函数组合起来就打开了用二维图画三维数据的无尽可能。
3. 频次直方图
频次直方图函数:
plt.hist()
plt.hist2d()
:二维频次直方图plt.hexbin()
:用正六边形分割的二维频次直方图
如果你只需要简单地计算频次直方图(就是计算每段区间的样本数),而并不想画图显示它们,那么:
可以直接用
np.histogram()
:>>> counts, bin_edges = np.histogram(data, bins=5) >>> print(counts) [12, 190, 468, 301, 29]
相应地,二维有
np.histogram2d()
函数,其用法如下:>>> counts, xedges, yedges = np.hisogram2d(x, y, bins=30)
还有一种评估多维数据分布密度的常用方法是核密度估计(kernel density estimation, KDE)。
KDE 方法通过不同的平滑带宽长度(smoothing length)在拟合函数的准确性与平衡性之间作出权衡(无处不在的偏差与方差的取舍问题的一个例子)。
现在先来简单地演示如何用 KDE 方法“抹掉”空间中离散的数据点,从而拟合出一个平滑的函数:
4. 可视化异常处理
4.1 基本误差线
x = np.linspace(0, 10, 50)
dy = 0.8
y = np.sin(x) + dy * np.random.randn(50)
plt.errorbar(x, y, yerr=dy, fmt='.k')

fmt
是一种控制线条和点的外观的代码格式,语法与plt.plot()
的缩写代码相同。errorbar
还有许多改善结果的选项,通过这些额外的选项可以轻松自定义误差线图形的绘画风格。我的经验是,让误差线的颜色比数据点的颜色浅一点效果会非常好,尤其是在那些比较密集的图形中:plt.errorbar(x, y, yerr=dy, fmt='o', color='black', ecolor='lightgray', elinewidth=3, capsize=0)
另外,还可以设置水平方向的误差线(xerr)、单侧误差线(one-sided errorbar),以及其他形式的误差线。
4.2 连续误差
有时候可能需要显示连续变量的误差。虽然Matplotlib没有内置的简便方法可以解这个问题,但是通过plt.plot()
与plt.fill_between()
来解决也不是很难:



5. 三维图
初始化
导入 Matplotlib 自带的 mplot3d
工具箱:from mpl_toolkits import mplot3d
,导入这个子模块之后,就可以在创建任意一个普通坐标轴的过程中加入projection='3d'
关键字,从而创建一个三维坐标轴。
对于三维图,默认的初始观察角度有时不是最优的,view_init()
方法可以调整观察角度与方位角。
# 此语句为将俯仰角调整为60度(x-y平面的旋转角度),方位角调整为35度(绕z轴顺时针旋转35度)
ax.view_init(60, 35)
三维数据点和线
默认情况下,散点会自动改变透明度,以在平面上呈现出立体感。


用ax.contour3D()
画三维等高线图,这里同要求所有数据都是二维网格数据形式,并且由函数计算 z 轴数值:


线框图和曲面图


极坐标绘图


曲面三角剖分
如果没有笛卡尔或极坐标风格的均匀绘制图形,该如何用一组随机数据画图呢?
有许多地方需要修补,这些工作可由
ax.plot_trisurf()
函数完成。它首先找到一组所有点都连接起来的三角形,然后用这些三角形创建曲面。