非数值型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
相关产品推荐
相关产品推荐

