Seaborn 如何在 ytick 上显示感兴趣的特定样本

Seaborn how to show specific samples of interest on ytick

''' 我使用 seaborn 做了一个包含数千个基因的 clustermap。因为,我只对少数基因感兴趣,所以我想在 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()

您的回答无效的原因如下:

查看 documentation 中关于 yticklabels 参数的内容:

If list-like, plot these alternate labels as the xticklabels.

所以基本上当你只传递几个刻度标签时,它只是将这些名称设置为刻度标签,而不知道刻度位置。解决这个问题的一种方法是执行以下操作,添加 sample_labels 为所有刻度标记,但将不感兴趣的标记设置为 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标签和位置(with credit to this post):

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 版本 (it seems),但这并不影响结果