Seaborn: countplot() with frequencies

后端 未结 3 1212
抹茶落季
抹茶落季 2020-11-28 05:36

I have a Pandas DataFrame with a column called \"AXLES\", which can take an integer value between 3-12. I am trying to use Seaborn\'s countplot() option to achieve the follo

3条回答
  •  攒了一身酷
    2020-11-28 06:22

    I got it to work using core matplotlib's bar plot. I didn't have your data obviously, but adapting it to yours should be straight forward.

    Approach

    I used matplotlib's twin axis and plotted the data as bars on the second Axes object. The rest ist just some fiddeling around to get the ticks right and make annotations.

    Hope this helps.

    Code

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    from mpl_toolkits.mplot3d import Axes3D
    import seaborn as sns
    
    tot = np.random.rand( 1 ) * 100
    data = np.random.rand( 1, 12 )
    data = data / sum(data,1) * tot
    
    df = pd.DataFrame( data )
    palette = sns.husl_palette(9, s=0.7 )
    
    ### Left Axis
    # Plot nothing here, autmatically scales to second axis.
    
    fig, ax1 = plt.subplots()
    ax1.set_ylim( [0,100] )
    
    # Remove grid lines.
    ax1.grid( False )
    # Set ticks and add percentage sign.
    ax1.yaxis.set_ticks( np.arange(0,101,10) )
    fmt = '%.0f%%'
    yticks = matplotlib.ticker.FormatStrFormatter( fmt )
    ax1.yaxis.set_major_formatter( yticks )
    
    ### Right Axis
    # Plot data as bars.
    x = np.arange(0,9,1)
    ax2 = ax1.twinx()
    rects = ax2.bar( x-0.4, np.asarray(df.loc[0,3:]), width=0.8 )
    
    # Set ticks on x-axis and remove grid lines.
    ax2.set_xlim( [-0.5,8.5] )
    ax2.xaxis.set_ticks( x )
    ax2.xaxis.grid( False )
    
    # Set ticks on y-axis in 10% steps.
    ax2.set_ylim( [0,tot] )
    ax2.yaxis.set_ticks( np.linspace( 0, tot, 11 ) )
    
    # Add labels and change colors.
    for i,r in enumerate(rects):
        h = r.get_height()
        r.set_color( palette[ i % len(palette) ] )
        ax2.text( r.get_x() + r.get_width()/2.0, \
                  h + 0.01*tot,                  \
                  r'%d%%'%int(100*h/tot), ha = 'center' )
    

提交回复
热议问题