基于Pandas DataFrame绘制多颜色散点图
解决plt.scatter传入分类型列着色的错误问题
哦,这个问题我之前也碰到过!原因很简单:plt.scatter()的c参数只接受数值型数据,而你的col3是分类型(不管是字符串还是Pandas的category类型),直接传入会触发类型错误——matplotlib没法把字符串直接映射成颜色值。
下面给你几种实用的解决方法:
方法1:用Pandas分类编码转数值
把分类型列转换成对应的数值编码,再传给c参数,然后手动添加图例对应原分类:
import matplotlib.pyplot as plt import pandas as pd from matplotlib import cm # 示例数据 data = pd.DataFrame({ "col1": [1, 2, 3, 4, 5], "col2": [5, 4, 3, 2, 1], "col3": ["A", "B", "A", "C", "B"] }) # 将col3转为分类编码 cat_col = data["col3"].astype("category") color_codes = cat_col.cat.codes # 绘制散点图 plt.scatter(data["col1"], data["col2"], c=color_codes, cmap=cm.tab10) # 添加对应原分类的图例 unique_cats = cat_col.cat.categories for idx, cat in enumerate(unique_cats): plt.scatter([], [], c=cm.tab10(idx), label=cat) plt.legend(title="col3") plt.xlabel("col1") plt.ylabel("col2") plt.show()
方法2:用Seaborn快速实现(最省心)
Seaborn的scatterplot()原生支持分类型列作为颜色区分参数(hue),自动帮你处理颜色映射和图例,代码极简:
import seaborn as sns import pandas as pd # 示例数据 data = pd.DataFrame({ "col1": [1, 2, 3, 4, 5], "col2": [5, 4, 3, 2, 1], "col3": ["A", "B", "A", "C", "B"] }) # 一行代码搞定 sns.scatterplot(data=data, x="col1", y="col2", hue="col3") plt.show()
方法3:手动指定分类-颜色映射
如果需要自定义每个分类的颜色,直接创建一个映射字典,把每个分类映射到具体颜色:
import matplotlib.pyplot as plt import pandas as pd # 示例数据 data = pd.DataFrame({ "col1": [1, 2, 3, 4, 5], "col2": [5, 4, 3, 2, 1], "col3": ["A", "B", "A", "C", "B"] }) # 自定义分类到颜色的映射 color_map = {"A": "#ff4444", "B": "#0099cc", "C": "#99cc00"} # 给每行数据匹配对应颜色 point_colors = data["col3"].map(color_map) # 绘制散点图 plt.scatter(data["col1"], data["col2"], c=point_colors) # 添加图例 legend_handles = [plt.scatter([], [], c=color_map[cat], label=cat) for cat in color_map.keys()] plt.legend(handles=legend_handles, title="col3") plt.xlabel("col1") plt.ylabel("col2") plt.show()
方法对比
- 方法1:适合需要用纯matplotlib的场景,灵活性强但需要手动处理图例;
- 方法2:最快最省心,适合快速探索数据,Seaborn会自动优化可视化效果;
- 方法3:完全自定义颜色,适合需要严格符合品牌色或特定配色的场景。
内容的提问来源于stack exchange,提问作者Abijah
相关产品推荐
相关产品推荐

