使用matplotlib自定义清晰的可视化代码

发布时间:2026/8/9 2:38:14
使用matplotlib自定义清晰的可视化代码 Matplotlib 入门到实战从安装到画出论文级图表适合谁读刚学 Python、想把数据画成图、写博客/做科研需要出图的同学。环境Windows / macOS / Linux 通用示例代码以 Python 3 Windows 为主。阅读时长约 15 分钟跟着敲一遍就能上手。一、为什么要学 Matplotlib它好在哪Matplotlib 是 Python 里最基础的绘图库几乎所有数据可视化工具seaborn、pandas 画图、深度学习框架可视化都建立在它之上。选它的理由1. 纯 Python、生态无缝衔接你用numpy算好的数组、pandas读好的表格、torch训好的曲线直接喂给 Matplotlib 就能画不用在不同软件间导来导去。2. 可脚本化、结果可复现Excel / Origin 是手点鼠标出图换个数据就得重画一遍。Matplotlib 是代码出图——数据变了改个数字重跑脚本图自动更新永远一致。这对科研、博客配图尤其重要。3. 出版级输出格式支持png / pdf / svg / eps分辨率dpi随便调。矢量图pdf/svg放到论文里放大不糊这是截图做不到的。4. 从一行出图到像素级控制都支持新手用plt.plot()一行就能出图老手用面向对象 API 能精确控制每一个边框、刻度、字体。一套工具覆盖全阶段。5. 免费、开源、跨平台不用买授权Windows / Mac / Linux 行为一致。简单对比工具适合场景缺点Excel随手画、临时看难复现、不美观、不能批处理Origin科研标配付费、闭源、换数据麻烦Matplotlib脚本化、可复现、出版级上手要写几行代码二、安装下载命令方式一pip 安装最通用pipinstallmatplotlibnumpy会作为依赖自动装好。如果你用的是国内网络、下载慢可以加清华源pipinstallmatplotlib-ihttps://pypi.tuna.tsinghua.edu.cn/simple推荐先建虚拟环境再装避免把包装得到处都是、互相冲突python-mvenv venv# 建环境venv\Scripts\activate# Windows 激活Mac/Linux 用 source venv/bin/activatepipinstallmatplotlib方式二Anaconda 用户condainstallmatplotlib验证安装是否成功importmatplotlibprint(matplotlib.__version__)能打印出版本号如3.9.4就说明装好了。三、基础使用教程3.1 你的第一张图importmatplotlib.pyplotasplt x[1,2,3,4,5]y[2,4,1,8,5]plt.plot(x,y)# 画线plt.title(My First Plot)plt.xlabel(X axis)plt.ylabel(Y axis)plt.show()# 弹窗显示pyplotplt是 Matplotlib 提供的快捷方式模块plot画线、show弹窗。3.2 理解两张画布Figure 与 Axes很多初学者分不清这两个概念记住一句话Figure 整张纸Axes 纸上的一块画图区域坐标系fig,axplt.subplots()# 推荐面向对象写法ax.plot(x,y)ax.set_title(用 Axes 画)plt.show()3.3 常见图类型一览图类型代码用途折线图ax.plot(x, y)趋势、训练曲线散点图ax.scatter(x, y)相关性、分布柱状图ax.bar(x, h)类别对比直方图ax.hist(data)数据分布饼图ax.pie(sizes)占比3.4 让图变好看美化四件套ax.plot(x,y,color#4C72B0,linewidth2,linestyle--,markero,label曲线A)ax.set_title(标题,fontsize14,weightbold)ax.set_xlabel(X);ax.set_ylabel(Y)ax.legend()# 显示图例靠 labelax.grid(alpha0.3)# 淡网格线color用#RRGGBB十六进制色比英文色名更精准linestyle--虚线markero数据点圆圈ax.legend()必须配合label才会显示3.5 中文显示必看的坑默认 Matplotlib 不含中文字体中文会显示成方块。一行搞定plt.rcParams[font.sans-serif][SimHei]# Windows 用黑体plt.rcParams[axes.unicode_minus]False# 让负号正常显示不同系统换字体名系统字体设置Windows[SimHei]macOS[Arial Unicode MS]或[PingFang SC]Linux[WenQuanYi Zen Hei]文泉驿3.6 保存图片而不是只弹窗plt.savefig(figure.png,dpi300,bbox_inchestight)dpi300打印/出版清晰度博客用 150 足够bbox_inchestight自动去掉周围白边想放论文存pdf或svg矢量无限放大不糊顺序提醒先savefig再showshow()之后图会被清空savefig 可能存到空白。3.7 无界面环境服务器/脚本必加一行在没有显示器的环境服务器、CI、后台脚本直接画图会报错。在import pyplot之前加importmatplotlib matplotlib.use(Agg)# 指定无界面后端importmatplotlib.pyplotasplt这样图只会存成文件不尝试弹窗。四、实战画一张论文级雷达图雷达图蜘蛛图用来对比多个模型在多个指标上的综合能力。下面是一段独立可跑的代码特点是网格是等边多边形不是默认的圆更符合出版审美支持中文能在无界面环境运行 雷达图 / 蜘蛛图绘制脚本 (Radar / Spider Chart) —— 等边多边形网格版 用途: 论文中多模型在多个指标上的综合对比可视化 依赖: matplotlib, numpy (yolonew_env 已包含) 改数据只动下面三处(1 指标名 / 2 各模型原始值 / 3 无需改,自动归一化) importmatplotlib matplotlib.use(Agg)# 无界面环境也能存图importnumpyasnpimportmatplotlib.pyplotaspltfrommathimportpi,cos,sin# 1. 指标名称(按需修改) METRICS[mAP0.5,mAP0.5:0.95,Precision,Recall,轻量性,实时性]Nlen(METRICS)# 2. 各模型原始数据(把真实结果填进来) # 精度类直接填真实值(0~1): map50 / map(mAP50-95) / p / r# params 单位 M(百万); fps 填实测帧率(相对值也可,仅用于绘图)RAW{YOLOv8n:dict(map500.7716,map0.5850,p0.770,r0.700,params3.20,fps142),CBAM:dict(map500.7854,map0.6000,p0.800,r0.720,params3.02,fps138),YOLOv8s:dict(map500.9350,map0.7720,p0.870,r0.820,params11.2,fps88),GVC(ours):dict(map500.7761,map0.5937,p0.772,r0.7085,params2.70,fps150),}COLORS[#4C72B0,#55A868,#C44E52,#DD8452]# 3. 归一化(全部转成越大越好, 0~1) PMINmin(d[params]fordinRAW.values())# 最轻模型作基准 - 轻量性FMAXmax(d[fps]fordinRAW.values())# 最快模型作基准 - 实时性DATA{}forname,dinRAW.items():DATA[name][d[map50],d[map],d[p],d[r],PMIN/d[params],# 参数量越小越轻 - 取倒数归一d[fps]/FMAX,# 帧率越大越快]# 4. 绘图(直角坐标 三角函数 - 等边多边形网格) # 各轴角度: 从正上方开始, 逆时针均匀 N 份 - 自然形成正 N 边形angles[pi/22*pi*i/Nforiinrange(N)]plt.rcParams[font.sans-serif][SimHei]# Windows 中文plt.rcParams[axes.unicode_minus]Falsefig,axplt.subplots(figsize(7,7),dpi150)ax.set_aspect(equal)# 保证多边形不被拉伸ax.axis(off)# ---- 网格: 每层一个同心正 N 边形 ----levels[0.2,0.4,0.6,0.8,1.0]forrinlevels:xs[r*cos(a)forainangles][r*cos(angles[0])]ys[r*sin(a)forainangles][r*sin(angles[0])]ax.plot(xs,ys,color#cccccc,lw0.8,alpha0.7)# 刻度数值标在第一根轴(正上方)左侧ax.text(-0.04,r,f{r:.1f},haright,vacenter,fontsize8,colorgrey)# ---- 轴射线 指标名 ----fori,ainenumerate(angles):ax.plot([0,cos(a)],[0,sin(a)],color#cccccc,lw0.8,alpha0.7)x,y1.12*cos(a),1.12*sin(a)hacenterifcos(a)0.1:haleftelifcos(a)-0.1:harightax.text(x,y,METRICS[i],haha,vacenter,fontsize12)# ---- 各模型数据多边形 ----for(name,vals),colorinzip(DATA.items(),COLORS):xs[v*cos(a)forv,ainzip(vals,angles)][vals[0]*cos(angles[0])]ys[v*sin(a)forv,ainzip(vals,angles)][vals[0]*sin(angles[0])]ax.plot(xs,ys,linewidth2,labelname,colorcolor)ax.fill(xs,ys,alpha0.10,colorcolor)ax.set_xlim(-1.35,1.35)ax.set_ylim(-1.35,1.35)ax.legend(locupper right,bbox_to_anchor(1.22,1.10),fontsize11,frameonFalse)plt.title(多模型综合性能雷达对比 (GVC vs 基线),fontsize14,pad22,weightbold)plt.tight_layout()plt.savefig(gvc_radar_chart.png,dpi150,bbox_inchestight)print([OK] saved gvc_radar_chart.png)关键点解释极坐标polarTrue的外圈永远是圆所以用直角坐标 三角函数算顶点才能画出正 N 边形set_aspect(equal)保证不被拉成椭圆改数据只动models字典图自动更新在这里插入图片描述五、常见坑速查表现象原因解决办法中文显示成方块缺中文字体rcParams[font.sans-serif][SimHei]服务器上报错无显示器matplotlib.use(Agg)保存的图是空白show()在savefig之前先savefig再show多条线叠在一起复用了同一个 axes每次画图前fig, ax plt.subplots()负号显示成方块字体问题rcParams[axes.unicode_minus]False图被裁掉一部分布局太挤bbox_inchestight或plt.tight_layout()六、总结 学习资源Matplotlib 上手只要记住三件事plot画线、savefig存图、rcParams解决中文。掌握基础后你会发现写代码出图比手点鼠标快得多而且永不走样。进阶方向seaborn在 Matplotlib 上封装统计图更漂亮、代码更短plotly交互式图表鼠标悬停看数值适合网页官网画廊https://matplotlib.org/gallery — 想要什么图直接抄示例代码改数据收藏本文下次画图直接对着速查表改就行。 Happy plotting!