How to add legend on Seaborn facetgrid bar plot

后端 未结 2 1267
情书的邮戳
情书的邮戳 2021-01-02 02:31

I have the following code:

import numpy as np
import pandas as pd
import matplotlib
matplotlib.use(\'Agg\')
import matplotlib.pyplot as plt
matplotlib.style.         


        
相关标签:
2条回答
  • 2021-01-02 02:57

    When the legend doesn't work out you can always make your own easily like this:

    import matplotlib
    
    name_to_color = {
        'Expected':   'green',
        'Provided':   'red',
        'Difference': 'blue',
    }
    
    patches = [matplotlib.patches.Patch(color=v, label=k) for k,v in name_to_color.items()]
    matplotlib.pyplot.legend(handles=patches)
    
    0 讨论(0)
  • 2021-01-02 03:09

    Some how there is one legend item for each of the subplot. Looks like if we want to have legend corresponds to the bars in each of the subplot, we have to manually make them.

    # Let's just make a 1-by-2 plot
    df = df.head(10)
    
    # Initialize a grid of plots with an Axes for each walk
    grid = sns.FacetGrid(df, col="walk", hue="walk", col_wrap=2, size=5,
            aspect=1)
    
    # Draw a bar plot to show the trajectory of each random walk
    bp = grid.map(sns.barplot, "step", "position", palette="Set3")
    
    # The color cycles are going to all the same, doesn't matter which axes we use
    Ax = bp.axes[0]
    
    # Some how for a plot of 5 bars, there are 6 patches, what is the 6th one?
    Boxes = [item for item in Ax.get_children()
             if isinstance(item, matplotlib.patches.Rectangle)][:-1]
    
    # There is no labels, need to define the labels
    legend_labels  = ['a', 'b', 'c', 'd', 'e']
    
    # Create the legend patches
    legend_patches = [matplotlib.patches.Patch(color=C, label=L) for
                      C, L in zip([item.get_facecolor() for item in Boxes],
                                  legend_labels)]
    
    # Plot the legend
    plt.legend(handles=legend_patches)
    

    0 讨论(0)
提交回复
热议问题