You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绘制带随机偏移的二维分类数据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:37:39