2016-07-22 15 views
2

Kämpfen, um dieses herauszufinden. Ich habe ein gestapeltes Balkendiagramm, das ich mit Python/Matplotlib erstellen möchte, und es scheint, dass es die Daten überlagert anstatt zu stapeln, was zu verschiedenen Farben führt (d. H. Rot + gelb = orange anstatt rot und gelb zu stapeln). Kann jemand sehen, was ich falsch mache?Gestapeltes Balkendiagramm in Matplotlib; Serien werden überlagert statt zu stapeln

Hier ist mein 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

Antwort

0

Sie haben Position manuell zu berechnen, aus denen Ihre Katzen bar wird (Blick auf die bottom Variable in meinem Code starten, wenn Katzen Plotten werden). Sie müssen Ihre eigene Methode vorschlagen, um die Position von Katzen Bars je nach Daten in Ihrem Datenrahmen zu berechnen.

Ihre Farben gemischt werden, weil Sie alpha Variable verwenden und wenn Stäbe dann würde Farben überschichtet gemischt:

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

+0

Dank einem Haufen für Ihre Hilfe! – NYCTed

Verwandte Themen