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

非数值型DataFrame散点图绘制及分类颜色映射问题咨询

Pandas字符匹配矩阵散点图颜色映射实现方案

问题原因

原有代码的核心错误如下:

  • 未筛选DataFrame中值为*的有效点位,直接匹配全量坐标会生成大量无效点位
  • 唯一字符提取逻辑有缺陷,仅取索引/列中长度更长的唯一值数组,可能遗漏仅在其中一侧出现的字符
  • 点位坐标与标签的对应逻辑错误,无法正确匹配字符与对应位置
  • 单颜色值传入散点函数时未做封装,会被matplotlib识别为色阶数值导致映射异常

完整实现代码

导入依赖

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

构造示例DataFrame

seq_1 = 'AATGMAM'
seq_2 = 'TATAMTM'
data = [["*" if p1 == p2 else "" for p2 in seq_2] for p1 in seq_1]
df = pd.DataFrame(data, columns=list(seq_1), index=list(seq_2))

绘图核心逻辑

# 提取所有有效点位(值为*的位置)的坐标,x对应索引位置,y对应列位置
y_idx, x_idx = np.where(df == "*")
# 每个点位对应的字符标签,取x坐标对应索引的字符值
point_labels = df.index[x_idx]

# 生成全局唯一字符的颜色映射,合并索引和列的所有唯一字符避免遗漏
unique_chars = np.union1d(df.index.unique(), df.columns.unique())
rgb_values = sns.color_palette("Set2", len(unique_chars))
color_map = dict(zip(unique_chars, rgb_values))

# 按字符分组绘制散点
for char in unique_chars:
    mask = point_labels == char
    # 颜色值封装为列表避免被识别为色阶数值
    plt.scatter(x_idx[mask], y_idx[mask], c=[color_map[char]], label=char, s=100)

# 配置坐标轴刻度
plt.xticks(np.arange(df.shape[0]), df.index)
plt.yticks(np.arange(df.shape[1]), df.columns)
plt.legend(title="字符类型")
plt.show()

逻辑说明

  • 先通过np.where(df == "*")过滤掉空值位置,只保留需要绘制的有效点位
  • 用np.union1d合并索引、列的所有唯一字符,保证所有出现的字符都有对应的颜色配置
  • 直接从索引值提取每个点位的字符标签,确保颜色映射关系完全对应
  • 单颜色值传入时封装为列表,规避matplotlib的色阶自动识别逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:45:04