python - 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()
解决方案
这就是您的答案不起作用的原因:
请参阅文档yticklabels
中的参数:
如果类似列表,则将这些备用标签绘制为 xticklabels。
所以基本上当你只传递几个刻度标签时,它只是将这些名称设置为刻度标签,而不知道刻度位置。解决此问题的一种方法是执行以下操作,添加sample_labels
which 为所有刻度创建一个标签,但将不感兴趣的刻度设置为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
(似乎),但这不会影响结果
推荐阅读
- python - 我不明白这行代码 tk.Tk.__init__(self,*args,**kwargs)
- vba - 具有多个范围的循环
- r - 以某种方式联合数据框,更新具有相同 row.name 的行
- node.js - 安装 node-sass --save-dev 时出现错误 404
- java - JPA,Composite Key 由外键和表列成员组成
- javascript - 如何将我的初始状态放入我的减速器文件中?
- javascript - jQuery .html() 函数导致 CWE-80:Veracode 中网页中与脚本相关的 HTML 标记的不正确中和(基本 XSS)警告
- r - 如何使用 r purrr:map 创建多个相同的对象(例如数据框)
- c# - 转换为 3D 后,速度反射不再起作用
- php - Laravel 控制器类型提示