如何基于Pandas DataFrame绘制带颜色映射与自定义标记的散点图
解决Pandas散点图的颜色映射与标记样式问题
问题分析
- 颜色映射报错:
ValueError: 'c' argument must be a color, a sequence of colors, or a sequence of numbers,原因是c参数不能直接传入类别型数据,需要转换为数值或明确的颜色序列。 - 标记样式映射:Pandas的
df.plot.scatter()一次只能指定一种标记,因此需要按set列分组,逐个绘制不同标记的散点。
解决方案代码
import pandas as pd import matplotlib.pyplot as plt # 示例数据 results = pd.DataFrame([[85,72,1,630], [67,50,1,700], [90,43,2,630], [79,53,2,700]], columns = ['x', 'y', 'day', 'set']) # 定义映射关系 # 颜色映射:每个day值对应一种颜色(可根据实际需求扩展) day_color_map = {1: '#FF6B6B', 2: '#4ECDC4'} # 标记映射:每个set值对应一种标记(支持的标记见matplotlib内置类型) set_marker_map = {630: 'o', 700: '^'} # 创建画布 fig, ax = plt.subplots(figsize=(8, 6)) # 按set分组循环绘图 for set_val, group in results.groupby('set'): marker = set_marker_map[set_val] # 将day值映射为对应的颜色 colors = group['day'].map(day_color_map) # 绘制当前set组的散点 group.plot.scatter( x='x', y='y', marker=marker, c=colors, s=100, # 设置点的大小 label=f'set={set_val}', ax=ax ) # 完善图表元素 ax.legend(title='Set') ax.set_title('Scatter Plot by Day (Color) and Set (Marker)') ax.set_xlabel('X Value') ax.set_ylabel('Y Value') plt.show()
扩展说明
- 如果
day是数值型(整数/浮点数),可直接用c=group['day']配合内置色板,代码简化为:
for set_val, group in results.groupby('set'): group.plot.scatter( x='x', y='y', marker=set_marker_map[set_val], c=group['day'], cmap='viridis', # 内置色板,可替换为其他如'coolwarm' s=100, label=f'set={set_val}', ax=ax ) # 添加颜色条说明day的数值对应关系 plt.colorbar(label='Day')
- 若
day或set的取值更多,只需扩展对应的映射字典即可,核心循环逻辑无需修改。
内容的提问来源于stack exchange,提问作者A Roush
相关产品推荐
相关产品推荐

