У меня есть фрейм данных со всеми парами расстояний между (фаговыми) вирусоподобными геномами.
distData = pd.read_csv("distances.tab",sep="\t")
print(distData.head())
reference-ID query-ID distance p-value shared-hashes
0 H055-6_SuMu_C01_Hinf H055-6_SuMu_C01_Hinf 0.000000 0.0 1000/1000
1 H049-6_SuMu_C01_Hinf H055-6_SuMu_C01_Hinf 0.002000 0.0 921/1000
2 H013-2_SuMu_C01_Hinf H055-6_SuMu_C01_Hinf 0.010914 0.0 660/1000
3 H081-1_SuMu_C01_Hinf H055-6_SuMu_C01_Hinf 0.040448 0.0 272/1000
4 H058-3_SuMu_C01_Hinf H055-6_SuMu_C01_Hinf 0.040310 0.0 273/1000
И я хочу воспроизвести кластерную карту с цветными листьями для расстоянийквадратная матрица squareDistMatrix , с использованием панд и морского рожка.
#Create the heatmap for distances
squareDistMatrix = pd.pivot_table(distData, values='distance', index=['query-ID'], columns='reference-ID')
squareDistMatrix.head()
reference-ID A001-2_Mu_C10_Aact A001-3_Aaphi23_C25_Aact A005-1_B3_C13_Aact A010-2_B3_C13_Aact A011-1_B3_C13_Aact
query-ID
A001-2_Mu_C10_Aact 0.000000 1.0 1.000000 0.136948 0.295981
A001-3_Aaphi23_C25_Aact 1.000000 0.0 1.000000 1.000000 1.000000
A005-1_B3_C13_Aact 1.000000 1.0 0.000000 0.052915 0.050764
A010-2_B3_C13_Aact 0.136948 1.0 0.052915 0.000000 0.005942
A011-1_B3_C13_Aact 0.295981 1.0 0.050764 0.005942 0.000000
Я перешел по следующим ссылкам:
Установка col_colors в карте скопления морского от панд
https://seaborn.pydata.org/examples/structured_heatmap.html
Однако эти ссылки не для кластерной карты сводной таблицы, созданной исходным кадром данных, содержащим данные.Также я хотел бы закрасить листья матрицы расстояний подстрокой в названии каждой строки.То есть все имена вирусов со средним SuMu находятся в одном суперскластере , эволюционной группировке, поэтому они присвоены одного цвета .
Я решил это с помощью другого стекового потокаpost:
Цвета колонок в кластерной карте Python Seaborn дают неожиданные результаты
Я просто вставляю свое решение для других заинтересованных пользователей:
#Function to get the super cluster name from the full name of the phage
#Input: phageFullName "H055-6_SuMu_C01_Hinf" (String)
#Output: superClusterName "SuMu" (String)
def getSuperClusterName(phageFullName):
return phageFullName.split("_")[1]
uniqueSuperClusters = distData['superCluster'].unique()
numUniqueSuperClusters = len(uniqueSuperClusters)
print("Unique superclusters: " + str(numUniqueSuperClusters))
#create distinct colors one for each supercluster
superClusterPalette = sns.husl_palette(numUniqueSuperClusters, s=.45)
#dict -> uniqueSuperClusterName: uniqueColour
superClusters2ColoursDict = dict(zip(uniqueSuperClusters, superClusterPalette))
#create a list of the supercluster of each row of the square distance matrix
superClusters = distData.superCluster
squareMatrixRows = list(squareDistMatrix.index)
superClusterInSquareMatrix = []
for row in squareMatrixRows:
superClusterInSquareMatrix.append(getSuperClusterName(row))
#create a Series of supercluster as found in the distance matrix
superClusterSeries = pd.Series(superClusterInSquareMatrix)
#map each supercluster to a colour using the dictionary
superClusterColours = pd.Series(superClusterSeries).map(superClusters2ColoursDict)
#clustermap with colors in the rows
sns.clustermap(squareDistMatrix, metric="correlation", method="single", cmap="RdBu_r", standard_scale=1, row_colors=superClusterColours.values, linewidths=.75, figsize=(13, 13))