别再只会用plt.scatter了!用Matplotlib画分类散点图的3个实用技巧(附完整代码)

张开发
2026/4/17 16:38:48 15 分钟阅读

分享文章

别再只会用plt.scatter了!用Matplotlib画分类散点图的3个实用技巧(附完整代码)
解锁Matplotlib分类散点图的进阶玩法3个让数据会说话的技巧当鸢尾花数据集在你的散点图上绽放出不同色彩当客户分群结果通过标记形状跃然屏上——这才是数据可视化真正的魅力所在。如果你还在用plt.scatter(x,y)的原始方式处理分类数据接下来的技巧将彻底改变你的图表叙事方式。1. 颜色与标记的自动化映射艺术处理分类数据时手动指定颜色和标记就像用铅笔绘制彩色漫画——费力且不专业。Matplotlib内置的样式循环器style cycler才是智能映射的秘密武器。import matplotlib.pyplot as plt import numpy as np from cycler import cycler # 创建模拟分类数据 np.random.seed(42) categories [A, B, C, D] x np.random.randn(100) y np.random.randn(100) labels np.random.choice(categories, 100) # 配置专业级样式循环 plt.rcParams[axes.prop_cycle] cycler(color[#1f77b4, #ff7f0e, #2ca02c, #d62728]) \ cycler(marker[o, s, ^, D]) fig, ax plt.subplots(figsize(10,6)) for cat in categories: mask labels cat ax.scatter(x[mask], y[mask], labelcat, s60, edgecolorw, linewidth0.5) ax.legend(titleCategories) ax.grid(True, alpha0.3) plt.tight_layout()这段代码实现了自动颜色/标记配对通过cycler对象建立颜色和标记的映射关系视觉一致性使用学术期刊推荐的Tableau调色板专业细节半透明网格线、白色边缘描边提升可读性提示通过plt.style.available查看所有内置样式plt.style.use(ggplot)可一键切换专业风格2. 三维分类的降维可视化技巧当你的数据包含超过两个分类维度时比如客户分群的年龄、性别、消费水平二维散点图就会捉襟见肘。这时需要一些降维魔法维度类型可视化编码方式适用场景主要分类颜色核心区分维度如客户等级次要分类标记形状次级分类如性别连续变量标记大小数值指标如消费金额时间序列透明度渐变数据演变过程# 多维度分类可视化实战 from sklearn.datasets import load_iris iris load_iris() features iris.data target iris.target species iris.target_names # 创建带有多维编码的散点图 plt.figure(figsize(12,8)) scatter plt.scatter(features[:,0], features[:,1], ctarget, cmapviridis, sfeatures[:,2]*50, # 花瓣宽度映射为大小 alpha0.7, edgecolork) # 添加专业图例 handles, _ scatter.legend_elements(propsizes, num3, alpha0.6) legend1 plt.legend(handles, [小, 中, 大], title花瓣宽度, locupper right) plt.gca().add_artist(legend1) plt.colorbar(scatter, label种类) plt.xlabel(花萼长度(cm)) plt.ylabel(花萼宽度(cm)) plt.title(鸢尾花多维度特征分布, pad20)这个案例展示了颜色映射区分不同花卉种类大小映射编码花瓣宽度数值专业图例双图例系统清晰展示不同编码维度3. 交互式分类探索的现代方案静态图表已经不能满足深度分析需求这些工具能让你的分类散点图活起来Plotly Express3行代码创建可缩放、悬停查看的分类散点图Bokeh构建带分类筛选器的交互式仪表板mpld3将Matplotlib图表转换为D3.js驱动的交互页面# 使用Plotly Express创建交互式分类散点图 import plotly.express as px df px.data.iris() fig px.scatter(df, xsepal_width, ysepal_length, colorspecies, sizepetal_length, hover_data[petal_width], title鸢尾花特征交互式探索) fig.update_layout(height600, width800) fig.show()交互功能包括鼠标悬停查看详细数据双击图例单独显示某类别框选放大局部区域动态切换坐标轴4. 分类散点图的排版美学当需要展示多组分类数据的对比时排版布局直接影响信息传达效率。下面是比较三种常见布局的优劣布局方式代码实现优点缺点并排子图plt.subplots(1,3)对比直观占用空间大分面网格sns.FacetGrid统一比例尺需要Seaborn动画帧FuncAnimation展示动态变化输出文件大# 专业级多图排版示例 from matplotlib.gridspec import GridSpec fig plt.figure(figsize(15,5)) gs GridSpec(1, 3, width_ratios[2,1,1]) # 主图 - 完整数据视图 ax0 fig.add_subplot(gs[0]) scatter ax0.scatter(x, y, clabels, cmaptab20, s50) ax0.set_title(全局视图) # 子图1 - 类别A分布 ax1 fig.add_subplot(gs[1]) ax1.scatter(x[labelsA], y[labelsA], color#1f77b4, s50) ax1.set_title(类别A分布) # 子图2 - 类别B分布 ax2 fig.add_subplot(gs[2]) ax2.scatter(x[labelsB], y[labelsB], color#ff7f0e, s50) ax2.set_title(类别B分布) plt.tight_layout()排版技巧使用GridSpec实现非均匀网格布局主图展示全局子图聚焦特定类别保持一致的色彩映射tight_layout()自动调整间距5. 分类边界的高效标注方法清晰的标注是专业图表区别于业余作品的关键。这些方法能让你的分类散点图信息更完整自动标注离群点使用DBSCAN算法识别并标注异常值分类区域着色基于SVM或KNN的决策边界填充智能标签避让使用adjustText库避免标签重叠# 分类边界与智能标注实战 from sklearn.svm import SVC from adjustText import adjust_text # 训练简单分类器 clf SVC(kernellinear).fit(features[:,:2], target) # 创建网格用于决策边界可视化 x_min, x_max features[:,0].min()-1, features[:,0].max()1 y_min, y_max features[:,1].min()-1, features[:,1].max()1 xx, yy np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100)) Z clf.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) plt.figure(figsize(10,8)) plt.contourf(xx, yy, Z, alpha0.1, levelslen(species)-1) scatter plt.scatter(features[:,0], features[:,1], ctarget, cmapviridis, s60) # 添加智能标注 texts [] for i, txt in enumerate(iris.target_names): # 计算每个类别的中心点 center_x np.median(features[targeti,0]) center_y np.median(features[targeti,1]) texts.append(plt.text(center_x, center_y, txt, fontsize12, hacenter)) adjust_text(texts) # 自动调整标签位置避免重叠 plt.colorbar(scatter, label种类) plt.title(带决策边界和智能标注的分类散点图, pad20)这个高级技巧组合了SVM分类器的决策边界半透明区域填充区分不同类别基于类别中心点的自动标注智能避让算法保持图表整洁

更多文章