我目前正在seaborn中生成群集地图并将行颜色标记如下。
matrix = pd.DataFrame(np.random.random_integers(0,1, size=(50,4)))
labels = np.random.random_integers(0,5, size=50)
lut = dict(zip(set(labels), sns.hls_palette(len(set(labels)), l=0.5, s=0.8)))
row_colors = pd.DataFrame(labels)[0].map(lut)
g=sns.clustermap(matrix, col_cluster=False, linewidths=0.1, cmap='coolwarm', row_colors=row_colors)
plt.show()
我有第二个注释列,类似于我想要添加到图中的标签数据。 seaborn API不支持添加第二个row_colors
列,这很好,但我正在努力寻找使用matplotlib将此注释列添加到群集的变通方法。
如果我不能使用seaborn来做这个并且必须使用matplotlib手动生成所有这些都没问题,我也无法解决这个问题。
感谢您的帮助!
答案 0 :(得分:4)
解决方案如下。 seaborn API确实允许这样做。
matrix = pd.DataFrame(np.random.random_integers(0,1, size=(50,4)))
labels = np.random.random_integers(0,5, size=50)
lut = dict(zip(set(labels), sns.hls_palette(len(set(labels)), l=0.5, s=0.8)))
row_colors = pd.DataFrame(labels)[0].map(lut)
#Create additional row_colors here
labels2 = np.random.random_integers(0,1, size=50)
lut2 = dict(zip(set(labels2), sns.hls_palette(len(set(labels2)), l=0.5, s=0.8)))
row_colors2 = pd.DataFrame(labels2)[0].map(lut2)
g=sns.clustermap(matrix, col_cluster=False, linewidths=0.1, cmap='coolwarm', row_colors=[row_colors, row_colors2])
plt.show()
这将生成一个包含两个附加列的Clustermap:
答案 1 :(得分:1)
我试图用pandas连接row_colors数据框,并且它起作用了! 请尝试以下代码:
import seaborn as sns; sns.set(color_codes=True)
import matplotlib.pyplot as plt
import pandas as pd
iris = sns.load_dataset("iris")
print(iris)
species = iris.pop("species")
lut1 = dict(zip(species.unique(), ['#ED2323','#60FD00','#808080']))
row_colors1 = species.map(lut1)
lut2 = dict(zip(species.unique(), "rbg"))
row_colors2 = species.map(lut2)
row_colors = pd.concat([row_colors1,row_colors2],axis=1)
print(row_colors)
g = sns.clustermap(iris, row_colors=row_colors, col_cluster=False,cmap="mako", yticklabels=False, xticklabels=False)
plt.show()
答案 2 :(得分:0)
还有另一种用于输入注释颜色的选项:您可以在行颜色或col_colors选项中提供整个数据框,而不是列表列表。
如果您的数据框带有要表示的多个注释,则此策略可能特别有用。您可以使用pandas函数replace来代替map。
诸如此类的东西可用于修改其他答案:
## This step is necessary because you can't use replace with the tuple rgb values
lut = {k:matplotlib.colors.to_hex(v) for k, v in lut.iteritems()}
annotations_df = annotations_df.replace(lut)
g=sns.clustermap(matrix, col_cluster=False, linewidths=0.1, cmap='coolwarm', row_colors=annotations_df)
plt.show()