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

如何通过Pandas分组直接实现散点图的分组着色?

Pandas按分组直接绘制着色散点图的方法

问题场景

现有如下Pandas DataFrame:

import pandas as pd
import matplotlib.pyplot as plt

# Sample data
data = {
    'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'y': [10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
    'z': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']
}

# Creating a pandas DataFrame
df = pd.DataFrame(data)

希望绘制按z列分组着色的散点图,尝试df.groupby('z').plot.scatter('x', 'y', color = 'z')未成功,目前通过循环遍历z唯一值的方式实现,但想找直接利用Pandas分组作为参数的更简洁方法。

可行解决方案

方法1:用Seaborn直接指定分组着色(推荐)

Seaborn的scatterplot原生支持通过hue参数按指定列分组着色,无需手动处理分组逻辑:

import seaborn as sns

sns.scatterplot(data=df, x='x', y='y', hue='z')
plt.show()

方法2:Pandas分组结合apply绘制

通过groupby配合apply,可以在同一画布上为每个分组绘制散点,同时指定对应颜色:

# 定义分组与颜色的映射关系
color_map = {'A': 'red', 'B': 'blue', 'C': 'green'}

plt.figure()
# 对每个分组应用绘图逻辑
df.groupby('z').apply(lambda group: plt.scatter(group['x'], group['y'], color=color_map[group.name], label=group.name))
plt.legend()
plt.show()

方法3:Pandas原生scatter结合数值映射

如果将分组列转换为数值型,可直接用Pandas的plot.scatter的c参数实现着色:

# 将字符串分组映射为数值
df['z_num'] = df['z'].map({'A': 0, 'B': 1, 'C': 2})

plt.figure()
df.plot.scatter(x='x', y='y', c='z_num', colormap='viridis')
plt.show()

原方法失败原因

你最初尝试的df.groupby('z').plot.scatter('x', 'y', color='z')无法生效有两个原因:

  1. 分组后的子DataFrame中z列是单一值,无法作为color参数的有效输入;
  2. groupby.plot默认会为每个分组单独生成子图,而非在同一画布上叠加绘制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:32:42