繁体   English   中英

如何在海上热图的yticklabel上添加颜色代码?

[英]How to add a colorcode to the yticklabels on a seaborn heatmap?

我有一个基因表达与细胞的矩阵,并希望将它们显示为热图,这本身不是问题。 但是,将所有基因显示为yticklabels太混乱而且视觉上不吸引人。 因此,我将每个基因都注释为属于一个特定的功能组,并希望将每个功能组表示为一种颜色,并在热图中显示其颜色,其顺序与基因出现的顺序相同。 只是为了澄清一下,我不希望将它们按颜色分组,我相信您可以使用seaborn clustermap来完成。

这样,到目前为止,我有一个熊猫数据框,其中包含基因及其各自功能组和细胞的多索引。

我在Stackoverflow和Google上进行了广泛的搜索,以寻找答案,但没有任何运气。 这是我第一次尝试任何类型的事情,因此很遗憾,我不知道从哪里开始。

因此,为简单起见,假设您具有以下数据框:

import seaborn as sns
import numpy as np
import pandas as pd

data=pd.DataFrame(np.array([(0,1,2),(4,5,6),(7,8,9)]), columns=['C1','C2','C3'], index=pd.MultiIndex.from_arrays([['Gene1','Gene2','Gene3'],['A','B','A']]))

这将产生以下结果:

           C1  C2  C3
Gene1   A   0   1   2
Gene2   B   4   5   6
Gene3   A   7   8   9

现在,我可以简单地调用sns.heatmap(data)来生成热图。 但是,如何自定义它,使我得到代表A和B的颜色,而不是将Gene1,Gene2,Gene3表示为yticklabels? 例如,假设A为蓝色,B为绿色,我希望它显示yticklabel(从顶部到底部)为蓝色,绿色,蓝色。

非常感谢。

这是一个创建热图左侧新轴的可能解决方案,该轴基于第二个Multiindex级别的值显示了另一个热图。

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
import pandas as pd

data=pd.DataFrame(np.array([(0,1,2),(4,5,6),(7,8,9)]), 
                  columns=['C1','C2','C3'], 
                  index=pd.MultiIndex.from_arrays([['Gene1','Gene2','Gene3'],['A','B','A']]))


cats = data.index.to_frame().set_index(0)
u, inv = np.unique(cats.values, return_inverse=True)

colors = ["navy", "limegreen", "gold"]
assert(len(u) <= len(colors))

cmap = mcolors.ListedColormap(colors)
norm = mcolors.BoundaryNorm(np.arange(len(u)+1)-.5, len(u))

fig, (sax, hax) = plt.subplots(ncols=2, sharey=True,
                               gridspec_kw=dict(width_ratios=[1, data.shape[1]]))

im = sax.imshow(np.atleast_2d(inv).T, cmap=cmap, norm=norm)
hax.imshow(data.values, cmap="Greys")

sax.set_yticks(np.arange(len(cats)))
sax.set_yticklabels(cats.index)
sax.tick_params(bottom=False, labelbottom=False)

hax.set_xticks(np.arange(len(data.columns)))
hax.set_xticklabels(data.columns)

cbar = fig.colorbar(im, cax = fig.add_axes([.125, .08, .1, .04]), 
                    orientation="horizontal", ticks=np.arange(len(u)))
cbar.set_ticklabels(u)

plt.show()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM