如何通过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')无法生效有两个原因:
- 分组后的子DataFrame中
z列是单一值,无法作为color参数的有效输入; groupby.plot默认会为每个分组单独生成子图,而非在同一画布上叠加绘制。
内容的提问来源于stack exchange,提问作者symbolrush
相关产品推荐
相关产品推荐

