Python 按行列出的Seaborn热图颜色
我有一张网络图 每个节点都是一个案例,每个边都是一个CPT 我使用community.best_分区将图形分成四个由颜色标注的社区 为了更好地可视化每个社区中共享的CPT和案例量,我使用plt.subplot和sns.heatmap创建了四个社区之间具有相似匹配颜色的热图 生成热图的代码:Python 按行列出的Seaborn热图颜色,python,matplotlib,seaborn,heatmap,Python,Matplotlib,Seaborn,Heatmap,我有一张网络图 每个节点都是一个案例,每个边都是一个CPT 我使用community.best_分区将图形分成四个由颜色标注的社区 为了更好地可视化每个社区中共享的CPT和案例量,我使用plt.subplot和sns.heatmap创建了四个社区之间具有相似匹配颜色的热图 生成热图的代码: fig, axs = plt.subplots(nrows=4, figsize=(16,8), sharex=True) cmaps = ['Blues', 'Oranges', 'Greens', 'R
fig, axs = plt.subplots(nrows=4, figsize=(16,8), sharex=True)
cmaps = ['Blues', 'Oranges', 'Greens', 'Reds']
comms = range(4)
for ax, cmap, comm in zip(axs, cmaps, comms):
sns.heatmap(
data=_.loc[[comm]],
ax=ax,
cmap=cmap,
annot=True,
annot_kws={
'fontsize' : 12
},
fmt='g',
cbar=False,
robust=True,
)
ax.set_ylabel('Community')
ax.set_xlabel('');
问题:
在sns.heatmap中是否有办法按行指定颜色在这种情况下,社区不必创建4个单独的热图
以下是一些示例数据:
cpt 52320 52353 52310 49568 50432 52234 52317 50435 52354 52332
comm
0 NaN 3.0 NaN 1.0 1.0 NaN 2.0 2.0 NaN 3.0
1 1.0 30.0 NaN NaN NaN 1.0 NaN NaN NaN 20.0
2 NaN NaN 160.0 NaN NaN NaN NaN NaN NaN NaN
3 NaN 7.0 NaN NaN NaN NaN NaN NaN 1.0 12.0
我认为使用seaborn的热图无法做到这一点,但可以使用imshow重新创建输出
我认为使用seaborn的热图无法做到这一点,但可以使用imshow重新创建输出
请注意,社区2中的值160几乎不可见。这是因为样本数据中只有一个值?没错,如果行中只有一个值,或者如果所有值都相等,那么代码就不是很健壮。我已经用一个额外的测试修改了我的答案,以考虑到这种可能性。请注意,您可能希望使用ax.annotatef'{val:.0f}'。。或者类似的方法来避免拖尾。0。当单元格变得太窄时,可以添加ax.annotate…,rotation=90注意到社区2中的值160几乎不可见。这是因为样本数据中只有一个值?没错,如果行中只有一个值,或者如果所有值都相等,那么代码就不是很健壮。我已经用一个额外的测试修改了我的答案,以考虑到这种可能性。请注意,您可能希望使用ax.annotatef'{val:.0f}'。。或者类似的方法来避免拖尾。0。当单元格太窄时,可以添加ax.annotate…,旋转=90
d = """ 52320 52353 52310 49568 50432 52234 52317 50435 52354 52332
0 NaN 3.0 NaN 1.0 1.0 NaN 2.0 2.0 NaN 3.0
1 1.0 30.0 NaN NaN NaN 1.0 NaN NaN NaN 20.0
2 NaN NaN 160.0 NaN NaN NaN NaN NaN NaN NaN
3 NaN 7.0 NaN NaN NaN NaN NaN NaN 1.0 12.0"""
df = pd.read_csv(StringIO(d), sep='\\s+')
N_communities = df.index.size
N_cols = df.columns.size
cmaps = ['Blues', 'Oranges', 'Greens', 'Reds']
fig, ax = plt.subplots()
for i,((idx,row),cmap) in enumerate(zip(df.iterrows(), cmaps)):
ax.imshow(np.vstack([row.values, row.values]), aspect='auto', extent=[-0.5,N_cols-0.5,i,i+1], cmap=cmap)
for j,val in enumerate(row.values):
vmin, vmax = row.agg(['min','max'])
vmid = (vmax-vmin)/2
if not np.isnan(val):
ax.annotate(val, xy=(j,i+0.5), ha='center', va='center', color='black' if (val<=vmid or vmin==vmax) else 'white')
ax.set_ylim(0,N_communities)
ax.set_xticks(range(N_cols))
ax.set_xticklabels(df.columns, rotation=90, ha='center')
ax.set_yticks(0.5+np.arange(N_communities))
ax.set_yticklabels(df.index)
ax.set_ylabel('Community')
ax.invert_yaxis()
fig.tight_layout()