如何绘制带随机偏移的二维分类数据3×3网格散点图
解决3×3网格分类数据点重叠问题的方案
这里有个能帮你解决问题的实用办法——核心思路是先把分类标签转换成对应数值坐标,再给每个点加个小范围的随机偏移,让它们落在网格单元格的间隙里,既保留分类位置的直观性,又能彻底避免点和名称重叠:
import pandas as pd import matplotlib.pyplot as plt import numpy as np ### Mock Data ### data = """A0,LOW,LOW A,MID,MID B,LOW,MID C,MID,HIGH D,LOW,MID E,HIGH,HIGH""" df = pd.DataFrame([x.split(',') for x in data.split('\n')]) df.columns = ['name','X','Y'] # 把分类标签映射为数值坐标(对应3×3网格的0/1/2) category_map = {'LOW': 0, 'MID': 1, 'HIGH': 2} df['x_num'] = df['X'].map(category_map) df['y_num'] = df['Y'].map(category_map) # 生成随机偏移,范围控制在±0.15,确保点在单元格内部不越界 np.random.seed(42) # 设置随机种子保证结果可复现 df['x_offset'] = df['x_num'] + np.random.uniform(-0.15, 0.15, size=len(df)) df['y_offset'] = df['y_num'] + np.random.uniform(-0.15, 0.15, size=len(df)) ### Plotting ### fig, axs = plt.subplots(figsize=(6,6)) # 用偏移后的坐标绘制散点 axs.scatter(df['x_offset'], df['y_offset'], color='blue', alpha=0.7) axs.set_xlabel('X') axs.set_ylabel('Y') # 添加名称标注,给标注加个小偏移更清晰 for idx, row in df.iterrows(): axs.annotate(row['name'], (row['x_offset'], row['y_offset']), xytext=(3, 3), textcoords='offset points') # 设置网格和坐标轴刻度,还原原始分类标签 axs.set_xticks([0,1,2]) axs.set_xticklabels(['LOW', 'MID', 'HIGH']) axs.set_yticks([0,1,2]) axs.set_yticklabels(['LOW', 'MID', 'HIGH']) axs.grid(True, linestyle='--', alpha=0.7) axs.set_axisbelow(True) fig.tight_layout() plt.show()
关键步骤说明:
- 分类转数值:把
LOW/MID/HIGH映射成0/1/2,让每个分类对应3×3网格的一个单元格位置,为后续偏移做基础 - 随机偏移:用
np.random.uniform生成小范围的偏移值,既保证点不会跑出当前单元格,又让同分类的点自动分散开,从根源避免重叠 - 标注优化:给标注加了
xytext=(3,3)的小偏移,让名称和点之间留点空隙,阅读起来更轻松 - 坐标轴还原:把刻度改回原始的分类标签,确保图表的业务可读性不受影响
这样处理后,每个数据点都会稳稳落在对应网格单元格的内部,彼此间距充足,名称也不会再挤在一起啦~
内容的提问来源于stack exchange,提问作者gustavz
相关产品推荐
相关产品推荐

