一、Matplotlib库的简述
Matplotlib是一个基于Python编程语言的创建静态、动态和人机交互式数据可视化的综合库(常用于数据分析、数据挖掘及基础的科研绘图等)。
Matplotlib通常与Pandas、Numpy共同使用。
二、Matplotlib中绘图的常见关键参数(所有图源[1])
(一)Figure(图形框)的组成结构
基础的图形绘制框由Legend(图例,说明)、Title(图表标题)、Grid(网格点)、Spine(图表封闭边框线)、Axes(数据绘制区域块,通常包含Axis对象并提供tick尺度信息)、Markers(数据点)、LIne(绘制线)、Axis(数据轴,设置尺度范围与生成tick及tick label)、Major tick(主刻度线—单位)及标签值、Minor tick(辅助估读刻度线)及标签值和Axis label(数据轴名称)组成。
实际上,Axes区域可以理解为各Axis单位长交汇出的区域,其一般包含了Axis对象。
(二)组合创建对象的参数解释(基于面向对象思想)
Ⅰ matplotlib.pyplot.figure()——仅生成画板
num(int或str或Figure或SubFigure):图形框实体独有的标识符,用于创建或激活Figure对象(Figure可以自动标识编码);
figsize((float,float)或default):设置初始的Figure图形框大小(Width,Height),后续可拖拉图形框调整;
dpi(float或default):图形框的分辨率,图像每英寸长度内的像素点数。该参数受到显示器分辨率的限制(查看计算机的显示器分辨率步骤:右键屏幕空白处->显示设置->显示器分辨率);
facecolor(color或default):图形框背景色;
edgecolor(color或default):图形框边界线颜色;
frameon(bool或default):是否绘制图形框的框架;
FigureClass(subclass of Figure,Figure子类):创建Figure子类实例;
clear(bool或default):是否清空指定图形框内容;
layout({‘constrained’,‘tight’,LayoutEngine,None}或default):定位绘画元素,避免Axes装饰重叠(控制子图标签覆叠)。constrained,限制模式;tight,固定模式。
Ⅱ matplotlib.pyplot.subplots()——同时生成画板及画纸区域(返回Figure和Axes数组)
该方法适用于多个相同设计布局的绘制,可同时对Figure对象进行设计。
nrows,ncols(int或default):定位安置多个画纸(即设置Axes区域),总画纸数=nrows×ncols;
sharex,sharey(bool或{‘none’,‘all’,‘row’,‘col’}):画纸是否共享axes属性,即是否共用坐标轴。一般为在列上共用x轴、在行上共用y轴、全部共用和相互独立;
squeeze(bool):处理Axes object的记录返回格式(控制返回参数ax);
width_ratios(array-like of length ncols):设置不同列的宽度(默认则全部宽度一致);
height_ratios(array-like of length nrows):设置不同行的宽度(默认则全部宽度一致);
subplot_kw(dict):组织群参数关键字字典通过add_subplot()函数创建画纸;
gridspec_kw(dict):组织群参数关键字字典通过GridSpec设计器创建画纸所用格网。
Ⅲ matplotlib.pyplot.subplot()——单次生成画纸区域(返回axes.SubplotBase)
*args(int(此处应为三位整数)或(int,int,index)或SubplotSpec):画纸在画板上放置位置的描述。前两位int即类似Ⅱ的nrows、ncols设计画纸布局,但是这里仅绘制一个Axes,因此前两位int相当于设计上的占位,而index则为画纸定位(index范围为[1-int×int],自上向下且自左向右编号);
projection({None,‘aitoff’,‘hammer’,‘lambert’,‘mollweide’,‘polar’,‘rectilinear’,str}):Axes的投影类型。str为自定义投影方式,默认为‘rectilinear’投影;
polar(bool):设置是否为极坐标系;
sharex,sharey(Axes):设置当前画纸的刻度、范围限制、尺度等都和输入Axes一致;
label(str):为返回的Axes设置标签。
Ⅳ add_subplot()——配合Ⅰ使用
基本参数与Ⅲ几乎一致,但是此处add_subplot应基于Ⅰ创建出来的画板实例使用。
该函数可以实现Figure.add_subplot(int,int,(int1,int2))功能,使得不同画纸可以占据不同大小。int1代表当前画纸的左上定位点,int2代表当前画纸的右下定位点。
举例:左(2,2,(1,3))| 右(2,2,(1,4))
Ⅴ matplotlib.axes.Axes.stem() — 点位茎杆图
locs(array-like):茎杆坐标轴根部点,与orientation相关。若orientation为vertical,则茎杆根部坐标轴为x轴;若orientation为horizontal,则茎杆根部坐标轴为y轴;
heads(array-like):茎杆的头部点;
linefmt(str):定义茎杆线段的颜色及线条类型;
markerfmt(str):定义茎杆头部标记点的颜色及形状;
basefmt(str):定义基线的特性;
orientation(str,{'vertical','horizontal'}):定义茎杆绘制的方向;
bottom(float):依赖于orientation,定义y轴与x轴的定位信息;
label(str):图例标识;
use_line_collection(bool):茎杆线条对象类型保存和绘制设置;
data(indexable object):提供数据数组。
Ⅵ matplotlib.axes.Axes.plot() — 绘制标记点或函数曲线,具体可选参数详见参考资料[7]
x,y(array-like / scalar,绘制方式一):对应因变量与自变量或坐标系下对应表示点坐标;
fmt(str):线条类型设置(线条形状、标记点形状、颜色);
data(indexable,绘制方式二):利用带标签的数据对象(有序)进行绘制;
scalex,scaley(bool):设置视图限制范围适应于数据限制范围;
**kwargs(Line2D类特性设置):
常用于多曲线同步绘制分析,并设置绘制曲线的各类特性信息(包括曲线标签、线宽、标记点颜色、曲线抗锯齿设置(antialiasing))。
Ⅶ matplotlib.axes.Axes.scatter() —离散点图绘制
x,y(float / array-like):数据点的坐标;
s(float / array-like):标记点大小设置(标记点大小可根据数据变化);
c(array-like / list of colors):设置标记点的颜色;
marker(MarkerStyle类对象):设置标记点的类型;
cmap(str / Colormap类对象):利用Colormap实例或标量映射颜色的注册Colormap来设置绘制颜色;
norm(str / Normalize):在使用cmap进行颜色映射时,将标量数据放缩至[0,1]范围内;
vmin,vmax(float):如果在使用标量但是没有明确归一化的情况下,vmin和vmax可以定义颜色映射的覆盖范围;
alpha(float):数值范围为[0,1],调节颜色透明度,0为透明(transparent),1为不透明(opaque);
linewidths(float / array-like):线宽;
edgecolors({’face‘,’none‘,None}或color或sequence of color):标记点形状的边界颜色设置;
plotnonfinite(bool):是否绘制非限定的点位,即异常数据(inf、nan、-inf)。
Ⅷ matplotlib.pyplot.show() —显示所有开启状态的Figure
(三)绘制输入数据要求
Matplotlib绘制函数的输入数据格式主要为Numpy的ndarray数据格式,常规的数据格式转换可采用Numpy.asarray()或Numpy.array()函数(例如Pandas.DataFrame、Numpy.matrix等)。
Numpy.asarray()与Numpy.array()的区别主要在于,若输入为Numpy.ndarray格式,那么前者相当于对原数组直接裁剪,而后者相当于对原数组进行深度复制。
三、Matplotlib绘图示例
(一)普通曲线、柱状二维平面图制作
1、常见函数绘制
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 在所设置的数域区间内形成等差数列,
# 当endingPoint=True时,公差=(stop-start)/(n-1)
x = np.linspace(2,4,50)
fig,ax = plt.subplots(figsize=(5,8),layout="constrained")
# 在axes画布区域进行常见函数绘制
ax.plot(x,x,label="y=x")
ax.plot(x,x**2,label="y=x^2")
ax.plot(x,x**3,label="y=x^3")
ax.plot(x,np.log(x),label="y=ln(x)")
ax.plot(x,1/x,label="y=1/x")
ax.plot(x,pow(2,x),label="y=2^x")
# axes区域的设计
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("Function Plot")
ax.legend()
# 图形显示
plt.show()
2、两组不同数据的同一绘制方法分离绘制
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 辅助绘制函数
def myPlot(ax,x,y,param_dict):
out = ax.plot(x,y,**param_dict)
return out
# 在所设置的数域区间内形成等差数列,
# 当endingPoint=True时,公差=(stop-start)/(n-1)
x = np.linspace(2,4,50)
# 利用列表解析方法生成y
y1 = [i for i in x]
y2 = [i**3 for i in x]
y = [y1,y2]
fig,(ax1,ax2) = plt.subplots(1,2,figsize=(5,3),layout="constrained")
ax = [ax1,ax2]
# 在axes画布区域进行绘制
for i in range(len(y)):
myPlot(ax[i],x,y[i],{'marker':'o'})
# axes区域的设计
ax1.set_xlabel("x1")
ax1.set_ylabel("y1")
ax2.set_xlabel("x2")
ax2.set_ylabel("y2")
# 图形显示
plt.show()
3、柱状图绘制
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
fig,ax = plt.subplots(figsize=(5,2.7),layout='constrained')
categories = ["cucumber","apple","banana","watermelon"]
num = [200,500,400,700]
ax.bar(categories,num)
# axes区域的设计
ax.set_xlabel("category")
ax.set_ylabel("amount")
# 图形显示
plt.show()
4、Color mapped data数据图绘制
需要注意的是,当一个画板中仅设置了一行的画布,那么其返回的画布索引列为一维数组。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# 构成网格矩阵数据(x,y,z)
# 若meshgrid中,sprse=True(数据稀疏展示)则具有numpy的broadcast性质
x,y = np.meshgrid(np.linspace(-3,3,100),np.linspace(-3,3,100))
z = x+y
# 构建画板与画布
fig,ax = plt.subplots(1,2,layout="constrained")
# 一画布(z单值对应一种色调)
# vmin和vmax是根据z的取值范围设置的颜色映射域(若z值有超出vmin、vmax的值则按临界颜色显示)
pc = ax[0].pcolormesh(x,y,z,vmin=-6,vmax=6,cmap="RdBu_r")
fig.colorbar(pc,ax=ax[0])
ax[0].set_title("pcolormesh")
# 二画布(z一段值域对应一种颜色)
pc2 = ax[1].contourf(x,y,z,levels=np.linspace(-6,6,13))
fig.colorbar(pc2,ax=ax[1])
ax[1].set_title("contourf")
# 显示
plt.show()
(二)动态柱状图制作(附加结合pynimate库)
具体详见参考资料[6]
(三)表格制作(附加结合plottable库)
具体详见参考资料[5]
(四)三维曲面制作
import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt
# 创建画板
fig = plt.figure()
# 添加画布
ax = fig.add_subplot(projection='3d')
x,y = np.meshgrid(np.arange(-5,5,0.25),np.arange(-5,5,0.25))
z = np.sin(np.sqrt(x**2+y**2))
pc = ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0)
# 设置z轴显示范围
ax.set_zlim(-1.01,1.01)
fig.colorbar(pc,shrink=0.5,aspect=10)
# 显示
plt.show()
(五)图像展示
import os
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
Filepath = r"D:\ThirdGhomework\CV\HelloRS32\2CultivatedLand"
imgNames = os.listdir(Filepath)
fig,ax = plt.subplots(1,10,figsize=(15,15))
for i in range(10):
imgPath = os.path.join(Filepath,imgNames[i])
img = mpimg.imread(imgPath)
ax[i].imshow(img)
ax[i].set_title("CultivatedLand",fontsize=8)
plt.show()
四、Matplotlib Cheatsheets and Handouts
该图表介绍了基础、简短的Matplotlib内置函数使用方法并提供了示例代码,详见参考资料[4]。
五、常用的绘图配色
参考资料:
[1]Matplotlib documentation — Matplotlib 3.6.3 documentation
[2]pandas - Python Data Analysis Library
[3]matplotlib.pyplot.figure — Matplotlib 3.6.3 documentation(多种数据可视化图形框设计)
[4]Matplotlib cheatsheets — Visualization with Python
[7]matplotlib.axes.Axes.plot — Matplotlib 3.6.3 documentation
[8]matplotlib.axes.Axes.set_title — Matplotlib 3.6.3 documentation