我有一个基因表达与细胞的矩阵,并希望将它们显示为热图,这本身不是问题。但是,将所有基因显示为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(从顶部到底部)为蓝色,绿色,蓝色。
非常感谢。
答案 0 :(得分:1)
在这里可能是一种解决方案,可以在热图的左侧创建一个新轴,该轴基于第二个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()