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

如何基于ID分组在同一画布中绘制按CLASS区分的XY散点图

按ID分组并在同一张图中按CLASS区分XY散点图

没问题,这是个非常实用的可视化需求,完全不需要手动逐个ID绘图,下面给你两种简洁的实现方案,都能轻松达到你的目标:

方法一:使用Matplotlib原生实现

这种方式灵活性更高,你可以自定义每个CLASS和ID的样式:

import pandas as pd
import matplotlib.pyplot as plt

# 先创建你的DataFrame(示例数据)
data = {
    'ID': ['A', 'A', 'A', 'B', 'B', 'C', 'C'],
    'X': [123, 789, 456, 111, 156, 167, 567],
    'Y': [456, 121, 333, 123, 123, 189, 789],
    'CLASS': [0, 1, 1, 1, 1, 1, 1]
}
df = pd.DataFrame(data)

# 定义CLASS对应的颜色(可以根据需求修改)
class_colors = {0: '#1f77b4', 1: '#ff7f0e'}
# 定义ID对应的标记样式(可选,用来区分不同ID)
id_markers = {'A': 'o', 'B': 's', 'C': '^'}

plt.figure(figsize=(10, 6))

# 按ID分组遍历
for id_name, group in df.groupby('ID'):
    # 再按CLASS细分每组内的点
    for cls in group['CLASS'].unique():
        subset = group[group['CLASS'] == cls]
        plt.scatter(
            subset['X'], 
            subset['Y'], 
            color=class_colors[cls],
            marker=id_markers[id_name],
            label=f"ID: {id_name} | CLASS: {cls}",
            s=100  # 点的大小
        )

plt.xlabel('X')
plt.ylabel('Y')
plt.title('XY Scatter Plot Grouped by ID and Classified by CLASS')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')  # 把图例放在图外,避免遮挡
plt.tight_layout()
plt.show()

方法二:使用Seaborn快速实现(更简洁)

Seaborn封装了很多可视化逻辑,一行核心代码就能搞定,适合快速出图:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 同样先创建DataFrame(如果已经有了可以跳过)
data = {
    'ID': ['A', 'A', 'A', 'B', 'B', 'C', 'C'],
    'X': [123, 789, 456, 111, 156, 167, 567],
    'Y': [456, 121, 333, 123, 123, 189, 789],
    'CLASS': [0, 1, 1, 1, 1, 1, 1]
}
df = pd.DataFrame(data)

plt.figure(figsize=(10, 6))
# 使用scatterplot,hue按CLASS分颜色,style按ID分标记样式
sns.scatterplot(
    data=df,
    x='X',
    y='Y',
    hue='CLASS',
    style='ID',
    palette={0: '#1f77b4', 1: '#ff7f0e'},  # 自定义CLASS颜色
    s=100  # 点的大小
)

plt.title('XY Scatter Plot Grouped by ID and Classified by CLASS')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()

小提醒:

你之前写的groups = df.groupby('id')要注意大小写,你的DataFrame列名是大写的ID,所以应该用df.groupby('ID'),否则会报错找不到列。两种方法都实现了:同一图中所有散点,按CLASS区分颜色,按ID区分标记样式,方便你同时观察两个维度的差异。

内容的提问来源于stack exchange,提问作者Balaganesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:02:36