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

如何对pandas DataFrame按分组绘制散点图且无需循环、正确显示图例

问题原因

你当前的代码中所有散点通过单次plt.scatter()调用绘制,matplotlib会将所有点识别为同一个数据系列,plt.legend()默认只会为每个系列分配1个标签,因此你传入的两个标签仅显示第一个long类。

更简单的无循环着色方案

两种无需for循环的实现方式如下:

方案1:使用seaborn的scatterplot(最便捷)

seaborn内置分类着色的hue参数,无需手动处理颜色映射,自动生成正确图例:

import seaborn as sns
import matplotlib.pyplot as plt

sns.scatterplot(
    data=geyser_df,
    x='waiting',
    y='duration',
    hue='kind',
    palette={'long': 'Navy', 'short': 'MediumVioletRed'}
)
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()

方案2:原生matplotlib分组绘制

如果你不想引入seaborn,可以直接按kind列拆分数据集,分两次调用scatter绘图,自动生成双图例:

import matplotlib.pyplot as plt

long_data = geyser_df[geyser_df['kind'] == 'long']
short_data = geyser_df[geyser_df['kind'] == 'short']

plt.scatter(long_data['waiting'], long_data['duration'], c='Navy', label='long')
plt.scatter(short_data['waiting'], short_data['duration'], c='MediumVioletRed', label='short')

plt.legend()
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()
原效果参考

散点图效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:36:07