Matplotlib散点图如何在指定网格区域添加自定义分层
Matplotlib 完全可以实现自定义区间分层标注的需求,不需要引入额外第三方库,核心是通过矩形补丁绘制分区背景、再在对应位置添加分区文本即可。
实现要点
- 先修正原代码的显性问题:原代码调用
sc.legend_elements()时没有定义sc变量,需要把ax.scatter()的返回值赋值给sc才能正常生成聚类图例 - 导入
Rectangle补丁类,针对每个分层的x、y取值范围绘制半透明背景块,设置较低透明度避免遮挡散点数据 - 用
ax.text()在每个分区的居中位置添加分层名称,设置较高的图层优先级保证文字显示在最上层 - 所有自定义分区添加完成后,再执行图例渲染、网格配置、绘图显示的逻辑即可
修改后可直接复用的代码
import matplotlib.pyplot as plt from matplotlib.patches import Rectangle # Define Data x = result.iloc[:,6] #R Score y = result.iloc[:,11] #FM Score z = result['cluster_label'] # 替换为实际使用的聚类标签列 # Create Figure fig, ax = plt.subplots(figsize=(8,6)) ax.set_ylabel('frequency & monetary score') ax.set_xlabel('recency score') # 补全sc变量赋值,解决原代码图例报错问题 sc = ax.scatter(x, y,c=z, cmap='viridis', alpha=0.5) # ========== 自定义分层核心配置 ========== # 分层规则格式:(x轴最小值, x轴最大值, y轴最小值, y轴最大值, 分层名称, 分区色块颜色) segment_rules = [ (4, 5, 6, 10, 'Champions', '#ff7f0e'), # 新增分层直接按格式在下方追加即可,示例: # (3, 4, 6, 10, 'Loyal Customers', '#2ca02c'), # (0, 2, 0, 3, 'Hibernating', '#d62728') ] for xmin, xmax, ymin, ymax, seg_name, color in segment_rules: # 绘制分区半透明背景 rect = Rectangle( (xmin, ymin), # 矩形左下角坐标 xmax - xmin, # 矩形宽度 ymax - ymin, # 矩形高度 color=color, alpha=0.2, # 透明度,数值越小色块越浅 zorder=0 # 图层顺序设为0,保证色块在散点、网格下方 ) ax.add_patch(rect) # 在分区中心位置添加分层名称文本 ax.text( (xmin + xmax)/2, # 文本x坐标:区间中点 (ymin + ymax)/2, # 文本y坐标:区间中点 seg_name, fontsize=10, ha='center', va='center', # 文本水平、垂直居中对齐 zorder=10 # 图层优先级设高,保证文字不被其他元素遮挡 ) # ========== 自定义分层配置结束 ========== ax.legend(*sc.legend_elements(), title="CLUSTER",loc='lower center', bbox_to_anchor=(0.5, 1.05),ncol=5, fancybox=True, shadow=True) ax.grid(True, zorder=-1) # 网格图层放到最下方,避免盖住分区色块 # 固定坐标轴范围,避免矩形补丁导致坐标轴自动缩放超出得分区间 ax.set_xlim(0, 5) # 按实际R分范围调整,常规RFM模型R分区间为1-5 ax.set_ylim(0, 10) # 按实际FM分范围调整,常规RFM模型FM分区间为1-10 plt.tight_layout() plt.show()
调整说明
- 如果不需要分区背景色块,只保留文字标注,直接删掉循环里绘制
Rectangle的代码段即可 - 色块透明度、颜色、文字大小都可以根据可视化需求修改对应参数
- 追加新分层只需要在
segment_rules列表里按格式新增元组,不需要重复编写绘图逻辑
注意:如果你的R得分、FM得分取值范围不是常规的1-5/1-10,记得同步修改
set_xlim、set_ylim的参数,以及每个分层的坐标范围,保证分区和实际业务规则对齐。
内容的提问来源于stack exchange,提问作者galih
相关产品推荐
相关产品推荐

