控制 seaborn 热图中的单个线宽

Posted

技术标签:

【中文标题】控制 seaborn 热图中的单个线宽【英文标题】:Control individual linewidths in seaborn heatmap 【发布时间】:2017-08-21 18:54:20 【问题描述】:

是否可以加宽 seaborn 热图中特定列和行的线宽?

比如这张热图可以

import numpy as np; np.random.seed(0)
import seaborn as sns; sns.set()
uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data, linewidths=1.0)

变成这样的东西:

【问题讨论】:

今天晚些时候还询问了similar question。 【参考方案1】:

这是可能的,但可能需要大量工作。一个可能的解决方案可能如下所示。它涉及绘制 6 个不同的热图并调整间距以使其看起来正常。然后还需要同步颜色缩放并手动设置颜色条。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(0)
import seaborn as sns; sns.set()

data = np.random.rand(10, 12)

asp = data.shape[0]/float(data.shape[1])
figw = 8
figh = figw*asp

cmap = plt.cm.copper
norm = matplotlib.colors.Normalize(vmin= data.min(), vmax= data.max())

gridspec_kw = "height_ratios":[9,1], "width_ratios" : [4,5,3]
heatmapkws = dict(square=False, cbar=False, cmap = cmap, linewidths=1.0, vmin= data.min(), vmax= data.max() ) 
tickskw =  dict(xticklabels=False, yticklabels=False)

left = 0.07; right=0.87
bottom = 0.1; top = 0.9
fig, axes = plt.subplots(ncols=3, nrows=2, figsize=(figw, figh), gridspec_kw=gridspec_kw)
plt.subplots_adjust(left=left, right=right,bottom=bottom, top=top, wspace=0.1, hspace=0.1*asp )
sns.heatmap(data[:9,0:4], ax=axes[0,0], xticklabels=False, yticklabels=True, **heatmapkws)
sns.heatmap(data[:9,4:9], ax=axes[0,1], xticklabels=False, yticklabels=False, **heatmapkws)
sns.heatmap(data[:9,9:12], ax=axes[0,2],xticklabels=False, yticklabels=False, **heatmapkws)

sns.heatmap(data[9:,:4], ax=axes[1,0], xticklabels=True, yticklabels=True, **heatmapkws)
sns.heatmap(data[9:,4:9], ax=axes[1,1], xticklabels=True, yticklabels=False, **heatmapkws)
sns.heatmap(data[9:,9:12], ax=axes[1,2], xticklabels=True, yticklabels=False,**heatmapkws)

axes[1,0].set_yticklabels([9])
axes[1,1].set_xticklabels([4,5,6,7,8])
axes[1,2].set_xticklabels([9,10,11])

cax = fig.add_axes([0.9,0.1,0.03,0.8])
sm = matplotlib.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
fig.colorbar(sm, cax=cax)

plt.show()

【讨论】:

这是正确答案(尽管使用for 循环而不是复制粘贴调用sns.heatmap 可以使代码更简洁。) @mwaskom 是的,代码可能会变得更简洁,但可能不太容易理解,因为循环需要控制 4 个不同的 numpy 索引以及 x 和 y 标记切换。现在,可以在循环外部设置刻度标签,但这使得获取刻度的默认状态在像素中间变得更加困难。这就是为什么我决定反对它。我认为任何人都更容易将上述解决方案改编成一个循环,而不是理解一个循环。无论如何,最讨厌的是适应正确的纵横比——顺便说一句,这在这里并不完美。 再次感谢欧内斯。你是一个很大的帮助。我可以用它!

以上是关于控制 seaborn 热图中的单个线宽的主要内容,如果未能解决你的问题,请参考以下文章

重叠 yticklabels:是不是可以控制 seaborn 中热图的单元格大小?

根据 Seaborn 中的散点图绘制热图

来自枢轴的seaborn热图中的数据顺序

热图中的日期轴 seaborn

更改 seaborn 热图中的某些方块

Seaborn热图顶行和底行被部分截断[重复]