Seaborn绘制百分比热力图如何固定色条范围为0-100%
seaborn百分比热力图固定0-100%颜色映射方案
问题原因
sns.heatmap()默认根据传入数据的实际最小值、最大值自动计算颜色映射区间,cbar_kws参数仅控制颜色条的刻度显示、文本格式,不会修改颜色映射的上下限,因此当数据最大值小于100时,会把当前数据的最大值映射到色条最顶端的深红色,出现颜色和百分比不匹配的问题。
修复方法
无需添加值为100的虚拟数据,调用sns.heatmap()时直接传入vmin=0、vmax=100两个参数,即可强制将颜色映射范围固定在0-100区间,保证百分比和颜色的对应关系始终准确。
修正后可运行代码
# 补全原代码缺失的依赖导入 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 数据构造逻辑保持不变 index_node_1 = ["Node 1", "Node 3", "Node 4", "Node 64"] columns = ["main_node", "standard_node", "type_17", "type_45", "type_20 (A)", "type_20 (B)", "type_23 (A)", "type_23 (B)", "type_25 (A)", "type_25 (B)", "type_38 (A)", "type_38 (B)", "type_39 (A)", "type_39 (B)"] df_hm_node_1 = pd.DataFrame( { columns[0]:[10, None, None, None], columns[1]:[None, 20, 30, 50], columns[2]: np.NAN, columns[3]:[5,None,None,None], columns[4]: np.NAN, columns[5]: np.NAN, columns[6]: np.NAN, columns[7]: np.NAN, columns[8]: np.NAN, columns[9]: np.NAN, columns[10]:np.NAN, columns[11]:np.NAN, columns[12]:np.NAN, columns[13]:np.NAN }, index = index_node_1) # 绘制热力图 fig, ax = plt.subplots(figsize=(12,4)) hm_node_1 = sns.heatmap( df_hm_node_1, cmap='RdYlGn_r', linewidths=1, vmin=0, # 固定颜色映射下限为0 vmax=100, # 固定颜色映射上限为100 cbar_kws={'format': '%.0f%%', 'ticks': [0, 25, 50, 75, 100]}, fmt='g', annot=True ) plt.title("Main node 1", fontsize=18) plt.show()
参数说明
vmin:设置颜色映射对应的最小数值,所有小于等于该值的数据都会映射到色条最底端的颜色vmax:设置颜色映射对应的最大数值,所有大于等于该值的数据都会映射到色条最顶端的颜色- 可根据需要在
cbar_kws的ticks中添加中间刻度,让色条读值更直观
内容的提问来源于stack exchange,提问作者eurojourney
相关产品推荐
相关产品推荐

