首页 > 解决方案 > Seaborn 如何在 ytick 上显示感兴趣的特定样本

问题描述

''' 我使用 seaborn 做了一个包含数千个基因的聚类图。因为,我只对少数基因感兴趣,所以我想在 ytick 上显示这些感兴趣的基因。我正在尝试使用 iris 数据集来解决这个问题。请在下面找到我的代码。我不确定如何以正确的索引获取感兴趣的样本。提前感谢您的帮助。

'''

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset('iris')
samples = ['sample_'+str(x) for x in list(iris.index)] #creating sample ID lining up with the internal index.[![enter image description here][1]][1]
iris.insert(0,'Sample_ID',samples) 
samples_of_interest = ['sample_41','sample_34','sample_114','sample_55'] #samples to be visible on ytick

sns.clustermap(iris.iloc[:,1:-1],yticklabels=samples_of_interest) #Not giving the expected result as all of thesmples of interest are not at their right index

plt.show()
plt.close()

标签: pythonpandasseabornheatmap

解决方案


这就是您的答案不起作用的原因:

请参阅文档yticklabels中的参数:

如果类似列表,则将这些备用标签绘制为 xticklabels。

所以基本上当你只传递几个刻度标签时,它只是将这些名称设置为刻度标签,而不知道刻度位置。解决此问题的一种方法是执行以下操作,添加sample_labelswhich 为所有刻度创建一个标签,但将不感兴趣的刻度设置为None. 然后,您按照此答案旋转刻度):

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset('iris')
samples = ['sample_'+str(x) for x in list(iris.index)]
iris.insert(0,'Sample_ID',samples) 
samples_of_interest = ['sample_41','sample_34','sample_114','sample_55']

sample_labels = [i if i in samples_of_interest else None
                 for i in iris['Sample_ID'] ]

cm=sns.clustermap(iris.iloc[:,1:-1], yticklabels=sample_labels)
plt.setp(cm.ax_heatmap.yaxis.get_majorticklabels(), rotation=0)

在此处输入图像描述

但这仍然不是理想的 b/c 有所有位置的刻度我确信有一种方法可以编辑它但是..

这是我更喜欢的一种方法:

clustergrid从(返回的对象)获取样本的新顺序clustermap,然后手动设置 y-tick 标签和位置(归功于这篇文章):

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset('iris')

samples_of_interest = [41, 34, 114, 55]
sample_names = ['Sample ' + str(i) for i in samples_of_interest]

cm=sns.clustermap(iris.iloc[:,:-1])  #note the loc has changed!

reorder = cm.dendrogram_row.reordered_ind
new_positions = [reorder.index(i) for i in samples_of_interest]
plt.setp(cm.ax_heatmap.yaxis.set_ticks(new_positions))
plt.setp(cm.ax_heatmap.yaxis.set_ticklabels(sample_names))

在此处输入图像描述

奇怪的是cm.ax_heatmap.yaxis.set...命令打印出版本get似乎),但这不会影响结果


推荐阅读