Pandas: Bar-Plot with two bars and two y-axis

后端 未结 4 951
清酒与你
清酒与你 2020-11-30 23:21

I have a DataFrame looking like this:

     amount     price
age
A     40929   4066443
B     93904   9611272
C    188349  19360005
D    248438  24335536
E             


        
相关标签:
4条回答
  • 2020-11-30 23:23

    Here is an other method:

    • create all the bars in left axes
    • move some bars to the right axes by change it's transform attribute

    Here is the code:

    import pylab as pl
    df = pd.DataFrame(np.random.rand(10, 2), columns=["left", "right"])
    df["left"] *= 100
    
    ax = df.plot(kind="bar")
    ax2 = ax.twinx()
    for r in ax.patches[len(df):]:
        r.set_transform(ax2.transData)
    ax2.set_ylim(0, 2);
    

    here is the output:

    enter image description here

    0 讨论(0)
  • 2020-11-30 23:32

    As mentioned by InLaw you should use secondary_y = 'amount'

    To add to his answer here is how to set the ylabels for the two axis:

    df.plot.bar(figsize=(15,5), secondary_y= 'amount')
    
    ax1, ax2 = plt.gcf().get_axes() # gets the current figure and then the axes
    
    ax1.set_ylabel('price')
    
    ax2.set_ylabel('amount')
    
    0 讨论(0)
  • 2020-11-30 23:37

    Using the new pandas release (0.14.0 or later) the below code will work. To create the two axis I have manually created two matplotlib axes objects (ax and ax2) which will serve for both bar plots.

    When plotting a Dataframe you can choose the axes object using ax=.... Also in order to prevent the two plots from overlapping I have modified where they align with the position keyword argument, this defaults to 0.5 but that would mean the two bar plots overlapping.

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    from io import StringIO
    
    s = StringIO("""     amount     price
    A     40929   4066443
    B     93904   9611272
    C    188349  19360005
    D    248438  24335536
    E    205622  18888604
    F    140173  12580900
    G     76243   6751731
    H     36859   3418329
    I     29304   2758928
    J     39768   3201269
    K     30350   2867059""")
    
    df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)
    
    fig = plt.figure() # Create matplotlib figure
    
    ax = fig.add_subplot(111) # Create matplotlib axes
    ax2 = ax.twinx() # Create another axes that shares the same x-axis as ax.
    
    width = 0.4
    
    df.amount.plot(kind='bar', color='red', ax=ax, width=width, position=1)
    df.price.plot(kind='bar', color='blue', ax=ax2, width=width, position=0)
    
    ax.set_ylabel('Amount')
    ax2.set_ylabel('Price')
    
    plt.show()
    

    Plot

    0 讨论(0)
  • 2020-11-30 23:45

    You just need to write: df.plot( kind= 'bar', secondary_y= 'amount')

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    from io import StringIO
    s = StringIO("""     amount     price
    A     40929   4066443
    B     93904   9611272
    C    188349  19360005
    D    248438  24335536
    E    205622  18888604
    F    140173  12580900
    G     76243   6751731
    H     36859   3418329
    I     29304   2758928
    J     39768   3201269
    K     30350   2867059""")
    df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)
    
    _ = df.plot( kind= 'bar' , secondary_y= 'amount' , rot= 0 )
    plt.show()
    

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