Seaborn Barplot - Displaying Values

后端 未结 6 765
不知归路
不知归路 2020-11-27 14:39

I\'m looking to see how to do two things in Seaborn with using a bar chart to display values that are in the dataframe, but not in the graph

1) I\'m looking to displ

相关标签:
6条回答
  • 2020-11-27 14:51

    Let's stick to the solution from the linked question (Changing color scale in seaborn bar plot). You want to use argsort to determine the order of the colors to use for colorizing the bars. In the linked question argsort is applied to a Series object, which works fine, while here you have a DataFrame. So you need to select one column of that DataFrame to apply argsort on.

    import seaborn as sns
    import matplotlib.pyplot as plt
    import numpy as np
    
    df = sns.load_dataset("tips")
    groupedvalues=df.groupby('day').sum().reset_index()
    
    pal = sns.color_palette("Greens_d", len(groupedvalues))
    rank = groupedvalues["total_bill"].argsort().argsort() 
    g=sns.barplot(x='day',y='tip',data=groupedvalues, palette=np.array(pal[::-1])[rank])
    
    for index, row in groupedvalues.iterrows():
        g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
    
    plt.show()
    


    The second attempt works fine as well, the only issue is that the rank as returned by rank() starts at 1 instead of zero. So one has to subtract 1 from the array. Also for indexing we need integer values, so we need to cast it to int.

    rank = groupedvalues['total_bill'].rank(ascending=True).values
    rank = (rank-1).astype(np.int)
    
    0 讨论(0)
  • 2020-11-27 14:52

    Works with single ax or with matrix of ax (subplots)

    from matplotlib import pyplot as plt
    import numpy as np
    
    def show_values_on_bars(axs):
        def _show_on_single_plot(ax):        
            for p in ax.patches:
                _x = p.get_x() + p.get_width() / 2
                _y = p.get_y() + p.get_height()
                value = '{:.2f}'.format(p.get_height())
                ax.text(_x, _y, value, ha="center") 
    
        if isinstance(axs, np.ndarray):
            for idx, ax in np.ndenumerate(axs):
                _show_on_single_plot(ax)
        else:
            _show_on_single_plot(axs)
    
    fig, ax = plt.subplots(1, 2)
    show_values_on_bars(ax)
    
    0 讨论(0)
  • 2020-11-27 14:53
    plt.figure(figsize=(15,10))
    graph = sns.barplot(x='name_column_x_axis', y="name_column_x_axis", data = dataframe_name ,  color="salmon")
    for p in graph.patches:
            graph.annotate('{:.0f}'.format(p.get_height()), (p.get_x()+0.3, p.get_height()),
                        ha='center', va='bottom',
                        color= 'black')
    
    0 讨论(0)
  • 2020-11-27 14:55

    A simple way to do so is to add the below code (for Seaborn):

    for p in splot.patches:
        splot.annotate(format(p.get_height(), '.1f'), 
                       (p.get_x() + p.get_width() / 2., p.get_height()), 
                       ha = 'center', va = 'center', 
                       xytext = (0, 9), 
                       textcoords = 'offset points') 
    

    Example :

    splot = sns.barplot(df['X'], df['Y'])
    # Annotate the bars in plot
    for p in splot.patches:
        splot.annotate(format(p.get_height(), '.1f'), 
                       (p.get_x() + p.get_width() / 2., p.get_height()), 
                       ha = 'center', va = 'center', 
                       xytext = (0, 9), 
                       textcoords = 'offset points')    
    plt.show()
    
    0 讨论(0)
  • 2020-11-27 14:56

    Just in case if anyone is interested in labeling horizontal barplot graph, I modified Sharon's answer as below:

    def show_values_on_bars(axs, h_v="v", space=0.4):
        def _show_on_single_plot(ax):
            if h_v == "v":
                for p in ax.patches:
                    _x = p.get_x() + p.get_width() / 2
                    _y = p.get_y() + p.get_height()
                    value = int(p.get_height())
                    ax.text(_x, _y, value, ha="center") 
            elif h_v == "h":
                for p in ax.patches:
                    _x = p.get_x() + p.get_width() + float(space)
                    _y = p.get_y() + p.get_height()
                    value = int(p.get_width())
                    ax.text(_x, _y, value, ha="left")
    
        if isinstance(axs, np.ndarray):
            for idx, ax in np.ndenumerate(axs):
                _show_on_single_plot(ax)
        else:
            _show_on_single_plot(axs)
    

    Two parameters explained:

    h_v - Whether the barplot is horizontal or vertical. "h" represents the horizontal barplot, "v" represents the vertical barplot.

    space - The space between value text and the top edge of the bar. Only works for horizontal mode.

    Example:

    show_values_on_bars(sns_t, "h", 0.3)
    

    0 讨论(0)
  • 2020-11-27 15:05

    Hope this helps for item #2: a) You can sort by total bill then reset the index to this column b) Use palette="Blue" to use this color to scale your chart from light blue to dark blue (if dark blue to light blue then use palette="Blues_d")

    import pandas as pd
    import seaborn as sns
    %matplotlib inline
    
    df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
    groupedvalues=df.groupby('day').sum().reset_index()
    groupedvalues=groupedvalues.sort_values('total_bill').reset_index()
    g=sns.barplot(x='day',y='tip',data=groupedvalues, palette="Blues")
    
    0 讨论(0)
提交回复
热议问题