Stacked Bar Chart in Matplotlib; Series Are Overlaying Instead Of Stacking
Question: Struggling to figure this one out. I have a stacked bar chart that I'm trying
to create with Python / Matplotlib and it seems to be overlaying the data
instead of stacking resulting in different colors (i.e. red+yellow = orange
instead of stacking red and yellow). Can anyone see what I'm doing wrong?

Here's my code:

    
    
    #Stacked Bar Char- matplotlib
    
    #Create the general blog and the "subplots" i.e. the bars
    f, ax1 = plt.subplots(1, figsize=(10,5))
    # Set the bar width
    bar_width = 0.75
    # positions of the left bar-boundaries
    bar_l = [i+1 for i in range(len(df4['bikes']))] 
    # positions of the x-axis ticks (center of the bars as bar labels)
    tick_pos = [i+(bar_width/2) for i in bar_l] 
    
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['bikes1'], width=bar_width, label='bikes', alpha=0.5,color='r', align='center')
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['bikes'], width=bar_width,alpha=0.5,color='r', align='center')
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['cats1'], width=bar_width, label='cats', alpha=0.5,color='y', align='center')
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['cats'], width=bar_width,alpha=0.5,color='y', align='center')
    
    # set the x ticks with names
    plt.xticks(tick_pos, df4['Year'])
    # Set the label and legends
    ax1.set_ylabel("Count")
    ax1.set_xlabel("Year")
    plt.legend(loc='upper left')
    ax1.axhline(y=0, color='k')
    ax1.axvline(x=0, color='k')
    
    
    # Set a buffer around the edge
    plt.xlim([min(tick_pos)-bar_width, max(tick_pos)+bar_width])
    plt.show()
    

[![enter image description
here](http://i.stack.imgur.com/XyCyD.png)](http://i.stack.imgur.com/XyCyD.png)


Answer: You have to manually calculate position from which your _cats_ bar will start
(look at the `bottom` variable in my code when _cats_ are plotting). You have
to propose your own method to calculate position of _cats_ bars depending on
data in your dataframe.

Your colors are mixed up because you use `alpha` variable and when bars
overlayed then colors would mixed up:

    
    
    import matplotlib.pylab as plt
    import numpy as np
    import pandas as pd
    
    df4 = pd.DataFrame.from_dict({'bikes1':[-1,-2,-3,-4,-5,-3], 'bikes':[10,20,30,15,11,11],
     'cats':[1,2,3,4,5,6], 'cats1':[-6,-5,-4,-3,-2,-1], 'Year': [2012,2013,2014,2015,2016,2017]})
    
    
    #Create the general blog and the "subplots" i.e. the bars
    f, ax1 = plt.subplots(1, figsize=(10,5))
    # Set the bar width
    bar_width = 0.75
    # positions of the left bar-boundaries
    bar_l = [i+1 for i in range(len(df4['bikes']))] 
    # positions of the x-axis ticks (center of the bars as bar labels)
    tick_pos = [i+(bar_width/2) for i in bar_l] 
    
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['bikes1'], width=bar_width, label='bikes', alpha=0.5,color='r', align='center')
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['bikes'], width=bar_width,alpha=0.5,color='r', align='center')
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['cats1'], width=bar_width, label='cats', alpha=0.5,color='y', align='center',
     bottom=[min(i,j) for i,j in zip(df4['bikes'],df4['bikes1'])])
    # Create a bar plot, in position bar_1
    ax1.bar(bar_l, df4['cats'], width=bar_width,alpha=0.5,color='y', align='center',
     bottom=[max(i,j) for i,j in zip(df4['bikes'],df4['bikes1'])])
    
    
    # set the x ticks with names
    plt.xticks(tick_pos, df4['Year'])
    # Set the label and legends
    ax1.set_ylabel("Count")
    ax1.set_xlabel("Year")
    plt.legend(loc='upper left')
    ax1.axhline(y=0, color='k')
    ax1.axvline(x=0, color='k')
    
    # Set a buffer around the edge
    plt.xlim([min(tick_pos)-bar_width, max(tick_pos)+bar_width])
    plt.show()
    

[![enter image description
here](http://i.stack.imgur.com/6WP70.png)](http://i.stack.imgur.com/6WP70.png)

