day-044-Matplotlib进阶-高级图表

发布时间:2026/7/28 0:26:42

day-044-Matplotlib进阶-高级图表 Day 44Matplotlib 进阶——统计图表与3D绘图柱状图、折线图、饼图已经熟练了。今天学更有分析味的图表箱线图看分布、小提琴图看分布形状、六边形热力图大数据散点、以及 Matplotlib 的 3D 功能。一、箱线图 boxplot()——一眼看清数据分布箱线图是数据分析和论文中最常用的统计图之一能同时展示中位数、四分位数、异常值。importmatplotlib.pyplotaspltimportnumpyasnp plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsenp.random.seed(42)# 模拟数据四个班级的考试成绩class_Anp.random.normal(75,10,50)# 平均75标准差10class_Bnp.random.normal(80,8,50)# 平均80标准差8class_Cnp.random.normal(70,15,50)# 平均70标准差15离散大class_Dnp.random.normal(85,12,50)# 平均85标准差12data[class_A,class_B,class_C,class_D]labels[一班,二班,三班,四班]fig,axesplt.subplots(1,2,figsize(14,5))# --- 图1基础箱线图 ---bpaxes[0].boxplot(data,labelslabels,patch_artistTrue,showmeansTrue)# 配色colors[#FF6B6B,#4ECDC4,#45B7D1,#96CEB4]forpatch,colorinzip(bp[boxes],colors):patch.set_facecolor(color)patch.set_alpha(0.7)axes[0].set_ylabel(考试成绩,fontsize12)axes[0].set_title(班级成绩箱线图,fontsize14,fontweightbold)axes[0].grid(True,alpha0.3,axisy)# --- 图2横向箱线图 散点叠加 ---bp2axes[1].boxplot(data,labelslabels,patch_artistTrue,vertFalse,showmeansTrue,meanpropsdict(markerD,markerfacecolorred,markersize8))forpatch,colorinzip(bp2[boxes],colors):patch.set_facecolor(color)patch.set_alpha(0.5)# 叠加原始数据点fori,(d,color)inenumerate(zip(data,colors),1):jitternp.random.normal(0,0.04,len(d))# 加抖动避免重叠axes[1].scatter(d,ijitter,alpha0.4,s20,colorcolor,edgecolorwhite,zorder3)axes[1].set_xlabel(考试成绩,fontsize12)axes[1].set_title(横向箱线图 原始数据点,fontsize14,fontweightbold)axes[1].grid(True,alpha0.3,axisx)plt.tight_layout()plt.show()箱线图怎么读┬ ─── 最大值上边缘 │ │ ┬ ─── 上四分位数 Q375% │ │ │ ───┼─── ─── 中位数50% │ │ │ ┴ ─── 下四分位数 Q125% │ ┴ ─── 最小值下边缘 ○ ─── 异常值离群点二、小提琴图 violinplot()——箱线图的升级版小提琴图 箱线图 密度曲线。既能看到统计量又能看到数据分布形状。fig,axesplt.subplots(1,2,figsize(14,5))# --- 图1基础小提琴图 ---vpaxes[0].violinplot(data,positions[1,2,3,4],showmeansTrue,showmediansTrue)fori,bodyinenumerate(vp[bodies]):body.set_facecolor(colors[i])body.set_alpha(0.7)axes[0].set_xticks([1,2,3,4])axes[0].set_xticklabels(labels)axes[0].set_ylabel(考试成绩,fontsize12)axes[0].set_title(小提琴图,fontsize14,fontweightbold)axes[0].grid(True,alpha0.3,axisy)# --- 图2箱线图 vs 小提琴图对比 ---# 同数据一半箱线图一半小提琴图data_combinednp.concatenate(data)labels_combinednp.repeat(labels,[len(d)fordindata])axes[1].boxplot(data,labelslabels,patch_artistTrue,widths0.3,positionsnp.arange(1,5)-0.15,showfliersFalse)vp2axes[1].violinplot(data,positionsnp.arange(1,5)0.15,showmediansTrue)fori,bodyinenumerate(vp2[bodies]):body.set_facecolor(colors[i])body.set_alpha(0.5)axes[1].set_xticks([1,2,3,4])axes[1].set_xticklabels(labels)axes[1].set_title(箱线图(左) 小提琴图(右) 同框对比,fontsize14,fontweightbold)axes[1].grid(True,alpha0.3,axisy)plt.tight_layout()plt.show()三、hexbin()——海量散点的高效可视化普通散点图数据一多就糊成一片。hexbin()用六边形格子统计每个区域的数据密度。np.random.seed(42)n10000# 一万个点# 模拟有相关性的双变量数据mean[0,0]cov[[1,0.7],[0.7,1]]x,ynp.random.multivariate_normal(mean,cov,n).T fig,axesplt.subplots(1,3,figsize(16,5))# --- 普通散点图 ---axes[0].scatter(x,y,s1,alpha0.3,color#5B9BD5)axes[0].set_title(f普通散点图 (n{n})\n糊成一片)axes[0].set_xlabel(X)axes[0].set_ylabel(Y)axes[0].grid(True,alpha0.3)# --- hexbin 六边形热力图 ---hbaxes[1].hexbin(x,y,gridsize40,cmapYlOrRd,mincnt1)plt.colorbar(hb,axaxes[1],label数据点数,shrink0.8)axes[1].set_title(hexbin 六边形密度图\n密度分布一目了然)axes[1].set_xlabel(X)axes[1].set_ylabel(Y)# --- 带等高线的 hexbin ---axes[2].hexbin(x,y,gridsize40,cmapBlues,mincnt1)# 叠加 KDE 等高线用 scipyfromscipy.statsimportgaussian_kde kdegaussian_kde(np.vstack([x,y]))xi,yinp.mgrid[-4:4:100j,-4:4:100j]zikde(np.vstack([xi.flatten(),yi.flatten()])).reshape(xi.shape)axes[2].contour(xi,yi,zi,levels6,colorsred,linewidths1.5,alpha0.7)axes[2].set_title(hexbin KDE 等高线)axes[2].set_xlabel(X)axes[2].set_ylabel(Y)plt.tight_layout()plt.show()四、3D 绘图入门Matplotlib 可以画 3D 图虽然不如专业工具强大但日常够用。# 导入 3D 模块frommpl_toolkits.mplot3dimportAxes3D# 虽未显式用但必须导入4.1 3D 曲线figplt.figure(figsize(14,5))# --- 3D 螺旋线 ---ax1fig.add_subplot(1,2,1,projection3d)tnp.linspace(0,4*np.pi,200)xnp.sin(t)ynp.cos(t)zt ax1.plot(x,y,z,b-,linewidth2)ax1.set_xlabel(X)ax1.set_ylabel(Y)ax1.set_zlabel(Z)ax1.set_title(3D 螺旋线,fontsize12,fontweightbold)# --- 3D 散点图 ---ax2fig.add_subplot(1,2,2,projection3d)np.random.seed(42)n300xsnp.random.randn(n)ysnp.random.randn(n)zsxs**2ys**2np.random.randn(n)*0.5scax2.scatter(xs,ys,zs,czs,cmapviridis,s20,alpha0.7)plt.colorbar(sc,axax2,shrink0.6,labelZ值)ax2.set_xlabel(X)ax2.set_ylabel(Y)ax2.set_zlabel(Z X² Y² noise)ax2.set_title(3D 散点图,fontsize12,fontweightbold)plt.tight_layout()plt.show()4.2 3D 曲面图# 曲面图 plot_surfacexnp.linspace(-5,5,100)ynp.linspace(-5,5,100)X,Ynp.meshgrid(x,y)Znp.sin(np.sqrt(X**2Y**2))# 涟漪函数figplt.figure(figsize(14,5))# --- 曲面图 ---ax1fig.add_subplot(1,2,1,projection3d)surfax1.plot_surface(X,Y,Z,cmapviridis,alpha0.85,linewidth0,antialiasedTrue)plt.colorbar(surf,axax1,shrink0.6,labelZ值)ax1.set_xlabel(X)ax1.set_ylabel(Y)ax1.set_zlabel(Z)ax1.set_title(plot_surface 曲面图,fontsize12,fontweightbold)# --- 线框图 ---ax2fig.add_subplot(1,2,2,projection3d)ax2.plot_wireframe(X,Y,Z,rstride5,cstride5,colorsteelblue,alpha0.6,linewidth0.5)ax2.set_xlabel(X)ax2.set_ylabel(Y)ax2.set_zlabel(Z)ax2.set_title(plot_wireframe 线框图,fontsize12,fontweightbold)plt.tight_layout()plt.show()4.3 3D 柱状图figplt.figure(figsize(8,6))axfig.add_subplot(111,projection3d)# 模拟 5天的4种产品销售数据daysnp.arange(5)productsnp.arange(4)data_3dnp.random.randint(10,100,(5,4))colors_3d[#FF6B6B,#4ECDC4,#45B7D1,#FFEAA7]_xnp.arange(5)# 天数_ynp.arange(4)# 产品_xx,_yynp.meshgrid(_x,_y)x_flat,y_flat_xx.ravel(),_yy.ravel()z_flatnp.zeros_like(x_flat)dxdy0.6dzdata_3d.T.ravel()# 每个柱子按产品颜色bar_colorsnp.repeat(colors_3d,5)ax.bar3d(x_flat,y_flat,z_flat,dx,dy,dz,colorbar_colors,alpha0.7,edgecolorwhite)ax.set_xlabel(天数)ax.set_ylabel(产品)ax.set_zlabel(销量)ax.set_xticks(_x)ax.set_yticks(_y)ax.set_yticklabels([手机,电脑,平板,耳机])ax.set_title(3D 柱状图5天 × 4产品,fontsize14,fontweightbold)plt.tight_layout()plt.show()五、踩坑记录 坑现象解决方案箱线图中文乱码标签出现方块确保 rcParams 字体设置在最前面violinplot 位置偏移图和标签对不齐手动指定positions[1,2,3...]hexbin 颜色全一样密度差异看不出调整gridsize越小格子越大越容易区分3D 图交互卡顿旋转视角很慢减少数据点或用rstride/cstride降低精度3D 图视角不对默认角度看不清ax.view_init(elev30, azim45)调整仰角和方位角scipy 未安装gaussian_kde 报错pip install scipy或跳过等高线部分六、总结图表类型函数一句话用途箱线图boxplot()比较组间分布差异小提琴图violinplot()看分布形状统计量六边形热力图hexbin()海量散点的密度分布3D曲线plot()with projection“3d”空间曲线3D曲面plot_surface()函数zf(x,y)可视化3D柱状bar3d()三维数据对比今天学完Matplotlib 能画的图表类型你已经掌握了 90%。明天是 Matplotlib 的最终篇——综合实战把前面 4 天的知识全部用在一个完整项目中。第44天打卡完成本系列是个人学习笔记如有错误欢迎在评论区指正交流。

相关新闻