如何用ggplot绘制以数值总和替代相关性的关联热力图?
实现法案主题重叠计数的热力图
核心思路是先构建主题共现矩阵(每个单元格对应同时属于两个主题的法案数量),再用热力图可视化这个矩阵,完全不需要依赖相关性计算。以下是具体实现步骤(以Python为例):
1. 数据预处理:构建共现矩阵
假设你的数据集是宽格式:每行1条法案,每列1个主题,值为1(法案属于该主题)或0(不属于)。我们可以直接用矩阵乘法计算共现矩阵:
import pandas as pd # 模拟你的数据集:5条法案,3个主题 data = pd.DataFrame({ "主题A": [1,1,0,0,1], "主题B": [1,0,1,1,0], "主题C": [0,1,1,0,0] }) # 计算共现矩阵:矩阵转置 × 原矩阵,得到每个主题对的重叠法案数 cooccur_matrix = data.T @ data
- 对角线值:对应单个主题的总法案数(比如
主题A的对角线值是3,代表有3条法案属于主题A) - 非对角线值:对应同时属于两个主题的法案数(比如
主题A和主题B的交叉值是1,代表有1条法案同时属于A和B)
如果需要区分「仅属于单个主题」和「重叠主题」,可以调整矩阵:
import numpy as np # 计算仅属于单个主题的法案数 only_single = data.sum(axis=0) - data[data.sum(axis=1)>=2].sum(axis=0) cooccur_matrix_only = cooccur_matrix.copy() np.fill_diagonal(cooccur_matrix_only.values, only_single.values)
2. 绘制自定义热力图
用seaborn.heatmap直接传入共现矩阵即可,完全不需要计算相关性:
import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8,6)) # 绘制热力图,annot=True显示单元格数值,fmt="d"确保显示整数 sns.heatmap(cooccur_matrix, annot=True, fmt="d", cmap="Blues", cbar=True, xticklabels=data.columns, yticklabels=data.columns) plt.title("法案主题重叠计数热力图") plt.show()
cmap:可以根据需求替换成Greens、Reds等配色- 如果不需要显示对角线区域,可以用
mask参数隐藏:mask = np.triu(np.ones_like(cooccur_matrix, dtype=bool)) sns.heatmap(cooccur_matrix, annot=True, fmt="d", cmap="Blues", mask=mask)
适配长格式数据集
如果你的原始数据是长格式(每行是法案+主题的对应关系),可以先转成宽格式再计算共现矩阵:
# 长格式转宽格式示例 long_data = pd.DataFrame({ "法案ID": [1,1,2,2,3,4,5], "主题": ["主题A","主题B","主题A","主题C","主题B","主题B","主题A"] }) wide_data = pd.crosstab(long_data["法案ID"], long_data["主题"])
内容的提问来源于stack exchange,提问作者babybonobo
相关产品推荐
相关产品推荐

