如何将结果矩阵与置信区间矩阵合并为带±符号的可视化矩阵?
合并结果矩阵与置信区间矩阵为「结果±CI」格式的热图
完全可以把两个矩阵合并到同一张热图里,核心思路是自定义热图的标注文本,把对应位置的结果值和置信区间拼接成「数值±CI」的格式,再让Seaborn热图用结果矩阵控制颜色,同时显示拼接后的标注。
完整实现代码
import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 生成示例数据(模拟你的结果矩阵和CI矩阵) np.random.seed(42) # 固定随机种子方便复现 x, y = np.random.rand(2, 1000) * 1 # 结果矩阵 hist, xedges, yedges = np.histogram2d(x, y, bins=10, range=[[0, 1], [0, 1]]) # CI矩阵(实际使用时替换成你的真实CI矩阵即可) hist_ci, _, _ = np.histogram2d(np.random.rand(1000), np.random.rand(1000), bins=10, range=[[0, 1], [0, 1]]) # 格式化坐标轴刻度 xedges = np.round(xedges, 2) yedges = np.round(yedges, 2) # 创建标注文本矩阵:每个单元格为「结果±CI」格式,可调整小数位数控制显示整洁度 annot_text = np.vectorize(lambda val, ci: f"{val:.1f}±{ci:.1f}")(hist.T, hist_ci.T) # 绘制热图 fig, ax = plt.subplots(figsize=(12, 10)) ax = sns.heatmap( hist.T, # 用结果矩阵控制热图颜色 annot=annot_text, # 传入自定义的标注文本 fmt='', # 关键:已提前生成格式化文本,无需再用fmt解析 linewidths=0.5, linecolor='b', center=True, annot_kws={"size": 10} # 调整标注字体大小,避免单元格拥挤 ) # 设置坐标轴刻度 ax.set_xticks(np.arange(len(xedges)), xedges) ax.set_yticks(np.arange(len(yedges)), yedges, rotation=0) ax.set(title='Results with Confidence Intervals') ax.invert_yaxis() plt.show()
关键细节说明
- 自定义标注文本:用
np.vectorize遍历两个矩阵的对应元素,拼接成指定格式的字符串,:.1f可根据需求调整小数位数(比如.2f显示两位小数)。 - fmt='':Seaborn的
annot默认会用fmt参数格式化数值,但我们已提前生成文本,所以设为空字符串避免解析出错。 - 热图颜色依据:
hist.T作为heatmap的输入数据,热图颜色会基于结果矩阵的数值变化;若想让颜色基于CI矩阵,替换成hist_ci.T即可。 - 字体大小调整:通过
annot_kws={"size": 10}调整标注字体,适配10x10矩阵的单元格尺寸。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

