如何对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
相关产品推荐
相关产品推荐

