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),但这并不影响结果
''' 我使用 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),但这并不影响结果