Make seaborn show a colorbar instead of a legend when using hue in a bar plot?

后端 未结 2 1123
温柔的废话
温柔的废话 2020-12-19 01:17

Let\'s say I want to make a bar plot where the hue of the bars represents some continuous quantity. e.g.

import seaborn as sns
titanic = sns.load_dataset(&quo         


        
相关标签:
2条回答
  • 2020-12-19 01:46

    You can try this:

    import matplotlib.pyplot as plt
    import seaborn as sns
    titanic = sns.load_dataset("titanic")
    g = titanic.groupby('pclass')
    survival_rates = g['survived'].mean()
    n = g.size()
    
    plot = plt.scatter(n.index, n, c=survival_rates, cmap='Reds')
    plt.clf()
    plt.colorbar(plot)
    ax = sns.barplot(x=n.index, y=n, hue=survival_rates, palette='Reds', dodge=False)
    ax.set_ylabel('n passengers')
    ax.legend_.remove()
    

    Output:

    0 讨论(0)
  • 2020-12-19 01:56

    The other answer is a bit hacky. So a more stringent solution, without producing plots that are deleted afterwards, would involve the manual creation of a ScalarMappable as input for the colorbar.

    import matplotlib.pyplot as plt
    import seaborn as sns
    titanic = sns.load_dataset("titanic")
    g = titanic.groupby('pclass')
    survival_rates = g['survived'].mean()
    n = g.size()
    
    norm = plt.Normalize(survival_rates.min(), survival_rates.max())
    sm = plt.cm.ScalarMappable(cmap="Reds", norm=norm)
    sm.set_array([])
    
    ax = sns.barplot(x=n.index, y=n, hue=survival_rates, palette='Reds', 
                     dodge=False)
    
    ax.set_ylabel('n passengers')
    ax.get_legend().remove()
    ax.figure.colorbar(sm)
    
    plt.show()
    
    0 讨论(0)
提交回复
热议问题