additional row colors in seaborn cluster map

前端 未结 3 748
遥遥无期
遥遥无期 2021-02-06 09:17

I am currently generating clustermaps in seaborn and labeling the row colors as below.

matrix = pd.DataFrame(np.random.random_integers(0,1, size=(50,4)))
labels          


        
相关标签:
3条回答
  • 2021-02-06 09:37

    The solution is below. The seaborn API does actually allow this to be done.

    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()
    

    This produces a Clustermap with two additional columns: Clustermap with two additional columns

    0 讨论(0)
  • 2021-02-06 09:46

    I tried to concat the row_colors dataframe by pandas and it worked! Please try this code:

    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()
    

    0 讨论(0)
  • 2021-02-06 09:58

    There is another option for feeding in the annotation colors: you can provide a whole dataframe in the row colors or col_colors options, instead of a list of lists.

    This strategy might be particularly helpful if you have a dataframe with several annotations you want represented. Instead of map, you can use the pandas function replace.

    Something such as this bit can be used to modify the other answer:

    ## 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()
    
    0 讨论(0)
提交回复
热议问题