Python — matplotlib.pyplot 绘图模块及常用函数
pyplot 的 rc 参数中文字符正常显示所需参数设置其它常用 rc 参数2. 绘制多个子图方法一: 先用 figure() 函数创建画布, 再用 figure.add_subplot() 方法创建子图创建画布创建子图方法二: 用 plt.subplots() 函数创建画布和子图plt 常用函数 tight_layout()3. 散点图与拟合散点图函数 scatter()numpy 补充多元正态
import matplotlib.pyplot as plt
1. 基本用法与折线图
pyplot 模块的常用函数
函数 | 描述 |
---|---|
figure | 创建一个空白画布,可以指定画布的大小和像素 |
figure.add_subplot 方法 | 创建并选中一个子图,可以指定子图所在的行号,列号和标号 |
subplots | 用 fig,ax = plt.subplots() 同时在 subplots 里建立一个 fig 对象、一个 axis 对象数组 |
title | 在当前绘图区中添加标题,可以指定标题的名称、颜色、字体等参数 |
xlabel | 在当前绘图区中添加 x x x 轴名称,可以指定名称、颜色、字体等参数 |
ylabel | 在当前绘图区中添加 y y y 轴名称,可以指定名称、颜色、字体等参数 |
xlim | 指定当前绘图区 x x x 轴的范围 |
ylim | 指定当前绘图区 y y y 轴的范围 |
xticks | 指定 x x x 轴刻度的数目与取值 |
yticks | 指定 y y y 轴刻度的数目与取值 |
legend | 指定当前绘图区的图例,可以指定图例的大小、位置、标签 |
plot | 绘制点以及点之间的连续线条(折线图) |
savefig | 保存绘制的图形 |
show | 在本机显示全部画布 figure 上的图形 |
折线图函数: matplotlib.pyplot.plot()
matplotlib.pyplot.plot(x, y, format_string, ...)
在当前画布 figure
的当前绘图区 Axes
中根据提供的 x,y 中的数据,在坐标系中一一对应绘制各点,以及上一点与下一点之间的连续线条。(折线图)
返回:由 matplotlib.lines.Line2D
线条组成的列表。
常用参数:
x
:x 轴数据,以类似数组的数据提供。y
:y 轴数据,以类似数组的数据提供。format_string
:控制点与线的格式字串 ,由表示色彩、点的形状以及线条线型的字符组合而成。
format_string
数据格式字符串由三项组成,格式为:
format_string = '[颜色][标记形状][线型]'
分别表示绘制的颜色、数据点的标记形状或线型,其中这三项每一项都是可选的,并可前后自由组合搭配。
常用 format_string 参数
颜色缩写 | 说明(颜色全称) | 点形状 | 说明 | 线型 | 说明 |
---|---|---|---|---|---|
'b' | 蓝色(blue) | '.' | 点 | '-' | 实线 |
'g' | 绿色(green) | 'o' | 圆 | '--' | 虚线 |
'r' | 红色(red) | '+' | 加号 | '-.' | 点划线 |
'y' | 黄色(yellow) | '*' | 星号 | ':' | 点构成的虚线 |
'k' | 黑色(black) | 'v' | 向下三角形 | ||
'c' | 青色(cyan) | '^' | 向上三角形 | ||
'm' | 紫红色(magenta) | '<' | 向左三角形 | ||
'w' | 白色(white) | '>' | 向右三角形 |
常用函数 grid () 控制各轴网格线的显示状态
matplotlib.pyplot.grid(b=None, which='major', axis='both', **kwargs)
常用参数:
b
:逻辑值或None
。决定是否显示网格线。如果提供了任何kwargs
,则假定您要打开网格,并且b
将被设置为True
。如果b
为None
且没有kwargs
,则将切换网格线的可见性。which
:哪些层级的刻度上需要网格线。主刻度、次刻度、两者:'major'
,'minor'
,'both'
。axis
:上述网格线出现在哪根轴。'both'
,'x'
,'y'
。
常用函数 savefig() 保存当前画布内容
matplotlib.pyplot.savefig(fname, dpi=None, quality=None,bbox_inches=None, ...)
常用参数:
fname
:字符串文件名或者已打开的文件对象。如果format
参数没有被设置,则输出格式从扩展名中获得(缺省:“PNG”)。- 支持的图像文件格式:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff
dpi
:分辨率。以每英寸点数为单位。如果为None
,则默认为使用当前画布图像的dpi
值。quality
:图像质量。范围从 1(最差)到 95(最佳)。仅当格式为 jpg 或 jpeg 时适用,否则忽略。如果为None
,则默认为(默认值:95)。应避免超过 95 的值;100 则完全禁用 JPEG 优化。bbox_inches
:以英寸为单位的边界框:仅保存图形的给定部分。如果为'tight'
,则为当前图像的 tight bbox。(保存矢量图不完整时可在保存时加上bbox_inches = 'tight'
)
常用函数 legend() 绘制图例
matplotlib.pyplot.legend(labels, loc, bbox_to_anchor, title, fontsize, ...)
#实用格式:
legend()
legend(labels)
legend(handles, labels)
常用参数:
handles
:已绘制的各种图形实例。可以用类似列表的方式提供。缺省值为所有已绘制的图形。labels
:图例文字。可用类似列表的方式提供。缺省值为绘制图形时在绘制的方法或函数中所提供的label
参数。loc
:相对位置。它和bbox_to_anchor
参数协同配合决定图例的最终位置。- 当不提供
bbox_to_anchor
参数时,loc
决定图例在图形边界中出现的相对位置。 - 当
loc
为两个元素的元组时,表示图例的左下角的 x,y 坐标(在整个坐标长度中的占比),此时bbox_to_anchor
参数将失效。 - 通常可以用字符串或数字来表示在区域中的相对位置 (见下表)。
- 当不提供
bbox_to_anchor
:图例锚定辅助参数:(x, y, width, height)
:以四个元素的元组给出bbox
(相对区域),x
,y
为该区域的左下角,其余两个为区域的宽和高,所有数据都是占比数。此时loc
参数将被解释成在此区域中的相对位置。(x,y)
:以两个元素的元组给出的相对坐标,此时loc
参数将被被解释成为图例本身的“方位点”的坐标占比。
title
:图例的标题。fontsize
:文字大小。数值型或字符串描述:'xx-small'
,'x-small'
,'small'
,'medium'
,'large'
,'x-large'
,'xx-large'
loc 参数位置的表示 | |
---|---|
位置字符串 | 位置码 |
'best' | 0 |
'upper right' | 1 |
'upper left' | 2 |
'lower left' | 3 |
'lower right' | 4 |
'right' | 5 |
'center left' | 6 |
'center right' | 7 |
'lower center' | 8 |
'upper center' | 9 |
'center' | 10 |
常用函数 text() 添加文字
matplotlib.pyplot.text(x, y, s, fontdict=None, **kwargs)
向图像中添加文本。
常用参数:
x
,y
: 浮点数, 放置文本的位置。默认情况下,这是在数据坐标中。可以使用transform
参数更改坐标系。s
: 字符串, 要添加的文本。
返回:创建的 Text
实例。
pyplot 的 rc 参数
matplotlib.pyplot.rcParams
是一个字典,其中每个键值对的 “键”,对应以字符串形式表现的 rc
参数名,“值” 对应该参数的值。通过修改字典键值对中的值,即可设定 rc
参数。
中文字符正常显示所需参数设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['font.size'] = 14 # 调整字体大小
plt.rcParams['text.usetex'] = False # 不使用 tex (与中文不能同时使用)
其它常用 rc 参数
rc 参数名称 | 说明 | 取值 |
---|---|---|
lines.linewidth | 线条宽度 | 0~10,默认值1.5 |
lines.linestyle | 线条样式 | 4 种样式:“-”,”–”,”-.”,”:” |
lines.marker | 线条上点的样式 | 可以取”o”,”D”,”+”等 |
lines.markersize | 点的大小 | 0~10,默认值1 |
2. 绘制多个子图
方法一: 先用 figure() 函数创建画布, 再用 figure.add_subplot() 方法创建子图
创建画布
matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, ...)
返回:Figure 画布对象
常用参数:
num
:画布的编号。如为None
,则系统自动提供(从 1 开始)。如为字符串,则作为画布窗口中的标题。figsize
:以英寸为单位的画布的尺寸,以[ 宽, 高 ]
方式提供。缺省值为[6.4, 4.8]
。dpi
:图像分辨率,设置每英寸的点数。缺省值为100dpi
。facecolor
:画布的颜色。
创建子图
matplotlib.figure.Figure.add_subplot(nrows, ncols, index, **kwargs)
创建的子图将在具有 nrows
行和 ncols
列的虚拟布局网格上占据索引位置。索引从左上角的 1 位置开始并向右向下逐渐增加。
返回:创建的子图,类型为 axes.SubplotBase
或者其它 Axes
的子类。
一次只能创建一个子图。
常用参数:
nrows
:在画布中的虚拟布局子图行数。ncols
:在画布中的虚拟布局子图列数。index
:在虚拟布局中创建的子图的索引号。决定子图的具体位置。
可以提供一个三位的数字,以合并的方式决定 nrows
、ncols
和 index
,因为通常行数和列数不会超过 9。
也可以三个参数分开提供。
方法二: 用 plt.subplots() 函数创建画布和子图
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, num=None, ...)
创建一张画布和一组子图。
返回:一个两个元素的元组:
fig
:Figure
画布ax
:Axes
对象(子图)或Axes
对象数组(多个子图)
常用参数:
nrows
,ncols
:可选,默认值:1。子图网格的行数/列数。sharex
,sharey
:逻辑值或'none'
,'all'
,'row'
,'col'
。控制 x (sharex) 或 y (sharey) 轴之间的属性共享:True
或"all"
:x 轴或 y 轴将在所有子图中共享。False
或"none"
:每个子图的 x 轴或 y 轴将是独立的。"row"
:每个子图行将共享一个 x 轴或 y 轴。"col"
:每个子图列将共享一个 x 轴或 y 轴。- 当子图沿列具有共享的 x 轴时,仅创建底部子图的 x 刻度标签。同样,当子图沿行具有共享的 y 轴时,仅创建第一列子图的 y 刻度标签。若要稍后打开其他子图的刻度标签,可使用
tick_params
。
num
:指定画布编号。在指定的画布上创建子图。
plt 常用函数 tight_layout()
plt.tight_layout()
调整子图之间和周围的填充。可用于解决子图间轴标签、刻度标签以及标题重合的问题。
3. 散点图与拟合
散点图函数 scatter()
Axes.scatter (x, y, s=None, c=None, marker=None, alpha=None, linewidths=None, edgecolors=None, ... **kwargs)
功能:绘制散点图。
常用参数:
x
,y
:散点图的数据源。类数组数据。s
,c
:点标记的尺寸(正常标记尺寸的平方)、标记的颜色。marker
:标记的风格,alpha
:透明度。0 透明,1 不透明。linewidths
:标记边缘线的宽度。edgecolors
:标记边缘线的颜色。
numpy 补充
多元正态分布矩阵
numpy.random.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)
返回:数组
常用参数:
mean
:是多维分布的均值。cov
:协方差矩阵。size
:指定生成的正态分布矩阵的大小。
多项式拟合函数
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
返回:通过
y
=
f
(
x
)
y=f(x)
y=f(x) 关系中大量
x
x
x 和
y
y
y 的对应数据,以数组类型返回拟合后的多项式系数。
常用参数:
x
,y
:多项式 y = f ( x ) y=f(x) y=f(x) 中大量实际 x x x 值和 y y y 值,以类似数组方式提供。deg
:设定多项式中所希望的最高阶数。
多项式对象
numpy.poly1d(c_or_r, r = False, variable=None)
根据多项式系数,封装并返回多项式对象,以便进一步根据多项式计算更多的 x x x 值所对应的 y y y 值。
返回:多项式对象。如要算出真正的多项式的值,需要将多项式对象当作函数使用,参数可以是多个
x
x
x 值的序列,可得到多个多项式的结果值。
常用参数:
c_or_r
:多项式的系数,类数组型。以幂次递减,或者如果r
参数的值为True
,则表示为多项式的根(多项式的值为 0 时 x 的值)。例如:poly1d([1, 2, 3])
代表 x 2 + 2 x + 3 x^2 + 2x + 3 x2+2x+3poly1d([1, 2, 3], True)
代表 ( x − 1 ) ( x − 2 ) ( x − 3 ) = x 3 − 6 x 2 + 11 x − 6 (x-1)(x-2)(x-3) = x^3 - 6x^2 + 11x -6 (x−1)(x−2)(x−3)=x3−6x2+11x−6
r
: 布尔型,可选。 如果为True
,则c_or_r
指定多项式的根。默认值为False
。
多项式对象属性:
c
:多项式的各个系数r
:多项式的根(多项式的值为 0 时 x 的值)o
:多项式的阶数(最高幂次数)
离散点拟合线绘制
- 根据数据调用
numpy.polyfit()
函数,获取多项式各项系数。 - 根据多项式系数调用
numpy.poly1d()
函数构造多项式对象。 - 通过类似函数调用的手法调用多项式对象,获得直线上各点的数据。(也可用
np.polyval()
得到拟合的预测值,参见 polyfit 进行多项式拟合) - 根据直线上各个点的数据使用
matplotlib.pyplot.plot()
函数绘制直线。
pandas 的散点矩阵图函数
pandas.plotting.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None, grid=False, diagonal='hist', marker='.',…… **kwargs)
常用参数:
frame
:pandas dataframe
对象。diagonal
: 对角线图形类型。‘hist’
,‘kde’
中选择1个:'hist'
:表示直方图 (Histogram plot)'kde'
:表示核密度估计 (Kernel Density Estimation)。- 默认
'hist'
。需要scipy
模块的支持。
4. 其它统计图
直方图
Axes.hist(x, bins=None, range=None, histtype='bar', label=None, ...**kwargs)
根据数据绘制直方图。
常用参数:
x
:指定要绘制直方图的数据。bins
:指定直方图条形的个数,默认 10。或序列表示的若干个区域边界。range
:指定直方图数据的上下界,超出范围的将被忽略。默认包含绘图数据的最大值和最小值。histtype
:画图的形状:'bar'
,'barstacked'
,'step'
,'stepfilled'
。
返回值:一个三个元素的元组,三个元素分别为:
n
:表示每一区间的数据个数,并组成序列。bins
:区间分界点组成的序列。个数为n
的长度 + 1 +1 +1。patches
:各个分区对象组成的序列。
饼图
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, ...)
常用参数:
x
:每块扇形占总和的百分比数值,如果sum(x)
> 1 >1 >1 会使用sum(x)
自动计算每块占总的百分比。explode
:每块扇形被炸离中心的距离,以相对于半径的比例来指定。labels
:每块扇形外侧显示的说明文字(数据标签)colors
:每块扇形的默认颜色:‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’
autopct
:控制饼图内百分比文字格式设置,可以使用格式化字符串。pctdistance
:饼内文字离开中心的距离,以相对于半径的比例来指定autopct
的位置刻度, 默认值为 0.6shadow
:在饼图下面画一个阴影。默认值:False
,即不画阴影;labeldistance
:label
标签的绘制位置,类似于pctdistance
,相对于半径的比例,默认值为 1.1, 如 < 1 <1 <1 则绘制在饼图内侧startangle
:起始绘制角度,默认图是从 x 轴正方向逆时针画起。
柱状图
(1) 用 plt.bar()
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, yerr, ...**kwargs)
常用参数:
x
:x 轴数据。通常,每个分类与连续的各个整数对应,给height
在 x 轴上定位。height
:y 轴对应柱的高度。数据个数与 x 的数据个数相同。width
:x 轴对应柱的相对宽度(等分宽度中的占比 ),默认 0.8 (保证柱与柱之间留有 0.2 的空隙)。bottom
:y 轴基准值,默认为 0。yerr
:y 轴误差线数据。
(2) 用 pandas 的绘图功能
DataFrame.plot.bar (x=None, y=None, **kwargs)
常用参数:
x
:各个分类的名字,如果不指定,则使用DataFrame
的行索引名作为各个分类名。y
:各个分类的数值数据,如果不指定,则使用DataFrame
的所有数值列数据,列名为图例中的数据名。rot
:轴刻度文字的角度。xlabel
、ylabel
:x 和 y 轴的轴标签。xlim
、ylim
:以2个元素的元组或列表决定 x 或 y 轴的上下限。title
:子图标签。grid
:逻辑值,表示是否显示网格线(x、y 轴同时控制)
5. 等高线图和三维表面图
等高线图
matplotlib.pyplot.contour([X, Y,] Z, [levels], **kwargs)
绘制等高线。
matplotlib.pyplot.contourf([X, Y,] Z, [levels], **kwargs)
填充等高线轮廓。
contour()
和 contourf()
分别绘制等高线和填充等高线。主要参数和返回值相同。
常用参数:
X
,Y
: 类数组,可选, Z 中的值的坐标。X
和Y
必须都是 2D 且具有与Z
相同的形状 (例如,通过numpy.meshgrid()
创建); 或者它们必须都是 1-D 且使得len(X)
= N = N =N 为Z
的列数,len(Y)
= M = M =M 是Z
的行数。X
和Y
都必须单调排序。
如果未给出,则假定它们是整数索引,即X = range(N)
,Y = range(M)
。Z
: 形状为(M, N)
的类数组, 需绘制的高度值。levels
: int 或类数组,可选, 确定等高线/区域的数量和位置。如果是int
n n n,则用MaxNLocator
在vmin
和vmax
之间自动选择不超过 n + 1 n+1 n+1 个较好的轮廓级别。如果是类数组,则在指定级别绘制等高线, 这些值必须按升序排列。
返回: matplotlib.contour.QuadContourSet
对象。
三维表面图
首先需要通过将 projection="3d"
关键字参数传递给 Figure.add_subplot
来创建 3D 坐标轴(属于 Axes3D
类)。
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
(3D Axes 中也可以用 plot
, scatter
等绘制折线图, 散点图等, 参见官方文档)
绘制三维表面图函数:
Axes3D.plot_surface(X, Y, Z, *args, norm=None, vmin=None, vmax=None, lightsource=None, **kwargs)
参数:
X
,Y
,Z
: 二维数组, 数据值。norm
: 标准化, 颜色图的规范化。vmin, vmax
:float
, 规范化的界限。lightsource
: 当shade
为True
时使用的光源。cmap
:Colormap
: 如'viridis'
,'gist_rainbow'
等。
示例
import matplotlib.pyplot as plt
import numpy as np
#节点的 x, y, z 坐标
xn=
yn=
zn=
#画等高线图
plt.subplot(121)
contr=plt.contour(xn,yn,zn)
plt.clabel(contr) #在等高线图中标出高度数据
#----------#
#画三维表面图
X,Y=np.meshgrid(xn,yn) #构造网格节点
ax=plt.subplot(122, projection='3d')
ax.plot_surface(X, Y, zn, cmap='viridis')
更多推荐
所有评论(0)