如何将多数据源组合与共同数据点数据绘制成热力图?
将数据源组合DataFrame转换为热力图的方法
1. 数据转换思路
你的DataFrame每一行代表一个数据源子集(True表示包含该数据源)和对应的共同数据点数量。要生成热力图,核心是把这些子集的count映射到一个数据源两两关系矩阵——行和列均为数据源名称,矩阵值表示两个数据源共同参与的组合的总数据点数量(也可包含单个数据源的总参与量)。
2. 具体代码实现
步骤1:提取每行的数据源子集
先把每行中True对应的数据源名称提取出来,生成子集列表:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 加载你的数据 data = { 's1': [True, False, False], 's2': [True, True, True], 's3': [False, False, True], 's4': [False, True, False], 'count': [2, 2, 2] } df = pd.DataFrame(data) # 提取每行的数据源子集 df['sources'] = df.apply(lambda row: row.index[row == True].tolist(), axis=1)
步骤2:构建两两关系矩阵
初始化对称矩阵,遍历每个子集,将count累加到所有两两组合的位置(包含自身,用于展示单个数据源的总数据点数量):
# 获取所有数据源名称 sources = df.filter(like='s').columns.tolist() # 初始化零矩阵 heatmap_data = pd.DataFrame(0, index=sources, columns=sources) # 遍历每行数据,更新矩阵 for idx, row in df.iterrows(): subset = row['sources'] cnt = row['count'] # 遍历子集内的所有两两组合 for i in subset: for j in subset: heatmap_data.loc[i, j] += cnt
转换后的矩阵结果:
| s1 | s2 | s3 | s4 | |
|---|---|---|---|---|
| s1 | 2 | 2 | 0 | 0 |
| s2 | 2 | 6 | 2 | 2 |
| s3 | 0 | 2 | 2 | 0 |
| s4 | 0 | 2 | 0 | 2 |
步骤3:绘制热力图
用seaborn绘制热力图,添加标注提升可读性:
plt.figure(figsize=(8,6)) sns.heatmap(heatmap_data, annot=True, cmap='Blues', fmt='d') plt.title('数据源组合数据点热力图') plt.xlabel('数据源') plt.ylabel('数据源') plt.show()
3. 扩展调整
- 如果仅需展示不同数据源间的交集,可在循环中跳过自身组合:
for i in subset: for j in subset: if i != j: heatmap_data.loc[i, j] += cnt - 若数据源数量较多,可调整热力图尺寸、颜色映射(如
cmap='viridis'),或关闭部分标注来优化可读性。
内容的提问来源于stack exchange,提问作者Bouji
相关产品推荐
相关产品推荐

