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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:45:43