第二章 快速入门指南本教程介绍 Matplotlib 的基本使用模式和最佳实践帮助快速上手。前置导入importmatplotlib.pyplotaspltimportnumpyasnp2.1 简单示例Matplotlib 将数据绘制在Figure画布/图像窗口中一个 Figure 可包含一个或多个Axes绘图坐标系。Axes 是二维绘图区域依托 x-y 坐标定位点位极坐标为 θ-r、3D 图为 x-y-z。使用pyplot.subplots()是创建带 Axes 的 Figure 最简便的方式# 创建包含单个 Axes 的画布fig,axplt.subplots()# 在坐标系上绘制折线数据ax.plot([1,2,3,4],[1,4,2,3])# 弹出窗口展示图形plt.show()环境说明Jupyter Notebook 等交互式环境可省略plt.show()单元格执行后自动渲染图表。2.2 图表的核心构成2.2.1 Figure 画布整个绘图顶层容器管理所有子 Axes、标题、图例、色条等绘图元素支持嵌套子图。创建画布常用写法# 空白画布无任何坐标系figplt.figure()# 1行1列单个坐标系fig,axplt.subplots()# 2行2列网格坐标系fig,axsplt.subplots(2,2)# 自定义不规则布局左侧一列右侧上下两个坐标系fig,axsplt.subplot_mosaic([[left,right_top],[left,right_bottom]])subplots()与subplot_mosaic()为快捷封装函数也可手动后续给画布添加 Axes。2.2.2 Axes 绘图坐标系依附于 Figure 的核心绘图对象承载数据绘制区域包含 2 个坐标轴3D 为 3 个。区分易混概念Axes完整绘图面板包含坐标轴、刻度、标签、标题、绘图线条等Axis单根 X/Y/Z 坐标轴Axes 常用配置方法set_title()设置坐标系标题set_xlabel()X 轴标签set_ylabel()Y 轴标签绝大多数绘图、轴范围、样式修改都通过 Axes 对象的方法完成。2.2.3 Axis 坐标轴管控坐标轴比例尺、数值范围生成刻度标记与刻度文本。刻度位置由Locator定位器控制刻度显示文本由Formatter格式化器控制二者组合可精细化自定义坐标轴展示效果。2.2.4 Artist 绘图元素艺术家画布上所有可见对象都属于 Artist包括 Figure、Axes、Axis、文字、折线、色块、图形补丁等。画布渲染时会遍历所有 Artist 完成绘制大部分 Artist 绑定在单个 Axes 下无法跨坐标系复用或移动。2.3 绘图函数支持的输入数据类型基础规则绘图接口优先接收numpy.array/numpy.ma.masked_array可被np.asarray()转为数组的类数组对象Pandas Series/DataFrame、numpy 矩阵不保证兼容建议提前转成 NumPy 数组bnp.matrix([[1,2],[3,4]])b_asarraynp.asarray(b)字典/DataFrame 快捷传参支持字典、结构化 NumPy 数组、Pandas DataFrame通过data参数直接传入字段名作为 x、ynp.random.seed(19680801)data{a:np.arange(50),c:np.random.randint(0,50,50),d:np.random.randn(50)}data[b]data[a]10*np.random.randn(50)data[d]np.abs(data[d])*100fig,axplt.subplots(figsize(5,2.7),layoutconstrained)# 直接引用字典key作为x、y、颜色、点大小ax.scatter(a,b,cc,sd,datadata)ax.set_xlabel(entry a)ax.set_ylabel(entry b)2.4 两种编程接口风格Matplotlib 分为面向对象 OO 显式接口和pyplot 隐式接口二选一即可。2.4.1 面向对象 OO 风格推荐正式项目手动创建 Figure 和 Axes调用 Axes 实例方法绘图结构清晰、多子图不易混乱xnp.linspace(0,2,100)fig,axplt.subplots(figsize(5,2.7),layoutconstrained)ax.plot(x,x,labellinear)ax.plot(x,x**2,labelquadratic)ax.plot(x,x**3,labelcubic)ax.set_xlabel(x label)ax.set_ylabel(y label)ax.set_title(Simple Plot)ax.legend()2.4.2 pyplot 函数式风格适合快速交互式调试由plt自动隐式管理画布与当前坐标系代码简短xnp.linspace(0,2,100)plt.figure(figsize(5,2.7),layoutconstrained)plt.plot(x,x,labellinear)plt.plot(x,x**2,labelquadratic)plt.plot(x,x**3,labelcubic)plt.xlabel(x label)plt.ylabel(y label)plt.title(Simple Plot)plt.legend()风格选用建议复杂多子图、封装函数、工程化量化项目强制使用 OO 面向对象写法Jupyter 临时画图、快速验证可视化效果使用 pyplot 简洁写法废弃提醒from pylab import *已被官方强烈弃用禁止使用2.4.3 封装通用绘图辅助函数重复绘图逻辑封装成函数统一接收 Axes 对象作为入参复用性最强defmy_plotter(ax,data1,data2,param_dict):通用绘图辅助函数outax.plot(data1,data2,**param_dict)returnout# 测试调用data1,data2,data3,data4np.random.randn(4,100)fig,(ax1,ax2)plt.subplots(1,2,figsize(5,2.7))my_plotter(ax1,data1,data2,{marker:x})my_plotter(ax2,data3,data4,{marker:o})2.5 Artist 绘图元素样式设置2.5.1 线条基础样式颜色、线宽、线型两种修改方式绘图函数传参直接指定接收绘图返回对象后续调用set_*方法修改fig,axplt.subplots(figsize(5,2.7))xnp.arange(len(data1))# 绘制第一条虚线直接配置样式ax.plot(x,np.cumsum(data1),colorblue,linewidth3,linestyle--)# 接收Line2D对象后续修改线型l,ax.plot(x,np.cumsum(data2),colororange,linewidth2)l.set_linestyle(:)2.5.2 颜色配置Matplotlib 支持多种颜色表达格式散点图可区分填充色与描边色fig,axplt.subplots(figsize(5,2.7))# facecolor内部填充edgecolor边框颜色ax.scatter(data1,data2,s50,facecolorC0,edgecolork)2.5.3 线宽、线型、标记大小规则线宽单位印刷磅pt1pt 1/72 英寸plot()的markersize控制点直径scatter()的s控制点视觉面积内置标记简写o圆点、d菱形、v倒三角、s正方形等fig,axplt.subplots(figsize(5,2.7))ax.plot(data1,o,labeldata1)ax.plot(data2,d,labeldata2)ax.plot(data3,v,labeldata3)ax.plot(data4,s,labeldata4)ax.legend()2.6 图表标注与文本2.6.1 坐标轴标签、标题、自由文本mu,sigma115,15xmusigma*np.random.randn(10000)fig,axplt.subplots(figsize(5,2.7),layoutconstrained)n,bins,patchesax.hist(x,50,densityTrue,facecolorC0,alpha0.75)ax.set_xlabel(长度 [cm])ax.set_ylabel(概率)ax.set_title(蚁兽长度\n实际上并非如此)# 坐标系内自由添加文本ax.text(75,.025,r$\mu115,\ \sigma15$)ax.axis([55,175,0,0.03])ax.grid(True)文本对象可直接附加字体、颜色等属性tax.set_xlabel(my data,fontsize14,colorred)2.6.2 LaTeX 数学公式渲染使用原始字符串r包裹$公式内容$内置解析引擎直接渲染数学符号ax.set_title(r$\sigma_i15$)2.6.3 箭头注释 annotate用箭头指向数据点并附带说明文字fig,axplt.subplots(figsize(5,2.7))tnp.arange(0.0,5.0,0.01)snp.cos(2*np.pi*t)line,ax.plot(t,s,lw2)ax.annotate(local max,xy(2,1),xytext(3,1.5),arrowpropsdict(facecolorblack,shrink0.05))ax.set_ylim(-2,2)2.6.4 图例 legend绘图时指定label调用ax.legend()自动生成图例fig,axplt.subplots(figsize(5,2.7))ax.plot(np.arange(len(data1)),data1,labeldata1)ax.plot(np.arange(len(data2)),data2,labeldata2)ax.plot(np.arange(len(data3)),data3,d,labeldata3)ax.legend()2.7 坐标轴尺度、刻度与特殊数据绘图2.7.1 坐标轴比例线性/对数等默认线性坐标支持对数、指数等非线性尺度示例对数 Y 轴fig,axsplt.subplots(1,2,figsize(5,2.7),layoutconstrained)xdatanp.arange(len(data1))data10**data1 axs[0].plot(xdata,data)# 设置Y轴为对数刻度axs[1].set_yscale(log)axs[1].plot(xdata,data)2.7.2 手动自定义刻度定位与文本set_xticks/set_yticks手动指定刻度位置与显示文字fig,axsplt.subplots(2,1,layoutconstrained)axs[0].plot(xdata,data1)axs[0].set_title(自动刻度)axs[1].plot(xdata,data1)# 指定X轴刻度位置和对应标签axs[1].set_xticks(np.arange(0,100,30),[zero,30,sixty,90])# 只指定Y轴位置使用默认数字标签axs[1].set_yticks([-1.5,0,1.5])axs[1].set_title(手动刻度)2.7.3 日期类型 分类字符串绘图1时间序列绘图frommatplotlib.datesimportConciseDateFormatter fig,axplt.subplots(figsize(5,2.7),layoutconstrained)# 生成连续小时日期数组datesnp.arange(np.datetime64(2021-11-15),np.datetime64(2021-12-25),np.timedelta64(1,h))datanp.cumsum(np.random.randn(len(dates)))ax.plot(dates,data)# 简洁日期格式化器ax.xaxis.set_major_formatter(ConciseDateFormatter(ax.xaxis.get_major_locator()))2分类字符串柱状图fig,axplt.subplots(figsize(5,2.7),layoutconstrained)categories[turnips,rutabaga,cucumber,pumpkins]ax.bar(categories,np.random.rand(len(categories)))注意若传入上千个数字格式的字符串Matplotlib 会全部识别为独立分类造成密密麻麻的刻度务必提前转为数值类型。2.7.4 双Y轴 / 次级坐标轴twinx()共享 X 轴右侧新增独立 Y 轴不同量级数据共用一张图secondary_xaxis/secondary_yaxis增加换算单位的次级坐标轴fig,(ax1,ax3)plt.subplots(1,2,figsize(7,2.7),layoutconstrained)l1,ax1.plot(t,s)# 右侧新建Y轴ax2ax1.twinx()l2,ax2.plot(t,range(len(t)),C1)ax2.legend([l1,l2],[Sine (left),Straight (right)])# 顶部新增角度换算次级X轴弧度 ↔ 角度ax3.plot(t,s)ax3.set_xlabel(Angle [rad])ax4ax3.secondary_xaxis(top,functions(np.rad2deg,np.deg2rad))ax4.set_xlabel(Angle [°])2.8 颜色映射展示三维数据用色彩表达第三维度数值常用pcolormesh、contourf、imshow、带c参数的scatter搭配colorbar颜色标尺frommatplotlib.colorsimportLogNorm X,Ynp.meshgrid(np.linspace(-3,3,128),np.linspace(-3,3,128))Z(1-X/2X**5Y**3)*np.exp(-X**2-Y**2)fig,axsplt.subplots(2,2,layoutconstrained)# 1. 色块热力图pcaxs[0,0].pcolormesh(X,Y,Z,vmin-1,vmax1,cmapRdBu_r)fig.colorbar(pc,axaxs[0,0])axs[0,0].set_title(pcolormesh())# 2. 填充等高线coaxs[0,1].contourf(X,Y,Z,levelsnp.linspace(-1.25,1.25,11))fig.colorbar(co,axaxs[0,1])axs[0,1].set_title(contourf())# 3. 图像显示对数归一化pcaxs[1,0].imshow(Z**2*100,cmapplasma,normLogNorm(vmin0.01,vmax100))fig.colorbar(pc,axaxs[1,0],extendboth)axs[1,0].set_title(imshow() with LogNorm())# 4. 散点颜色映射pcaxs[1,1].scatter(data1,data2,cdata3,cmapRdBu_r)fig.colorbar(pc,axaxs[1,1],extendboth)axs[1,1].set_title(scatter())2.8.1 色板 cmap通过cmap参数指定内置/自定义颜色映射方案。2.8.2 数值归一化 norm用norm实现非线性映射如上例对数LogNorm替代简单的vmin/vmax线性截断。2.8.3 颜色条 colorbar画布级别的标尺组件绑定绘图对象读取映射规则可调整位置、大小、两端延伸箭头。2.9 多画布与复杂子图布局多次调用plt.figure()/plt.subplots()可以生成多个独立窗口画布用变量引用自由操控subplot_mosaic实现跨行跨列的不规则布局fig,axdplt.subplot_mosaic([[upleft,right],[lowleft,right]],layoutconstrained)axd[upleft].set_title(upleft)axd[lowleft].set_title(lowleft)axd[right].set_title(right)2.10 更多阅读如需了解全量绘图类型查阅官方 Axes API 参考文档。