2016-04-19 13 views
1

積み上げ棒グラフを生成して、複数の日にわたる1時間ごとの3つのパラメータを追跡しようとしています。サンプルプロットの画像はSamplePlotです。 しかし、私はこれをPythonでプロットすることに成功しませんでした。私がPythonの初心者であるという事実は、事態を悪化させます。pythonでmatplotlibを使用して積み上げ棒グラフに複数の列を積み重ねる3

この質問に以前に回答した2つの試みは、Horizontal stacked bar chart in Matplotlibstack bar plot in matplotlib and add label to each section (and suggestions)です。しかし、私は、上記の解決策のいずれかの後に、望ましい結果を達成することができませんでした。

誰でもプロットを生成する方法や方向を指示する方法に関するガイダンスを私に提供できますか?

編集1: 次のように私が書いたコードは次のとおりです。

import matplotlib.pyplot as plt; plt.rcdefaults() 
import numpy as np 
import matplotlib.pyplot as plt 

status_day1 = [[0.2,0.3,0.5], [0.1,0.3,0.6], [0.4,0.4,0.2], [0.6,0.1,0.4]] 
status_day2 = [[0.1,0.2,0.7], [0.3,0.2,0.5], [0.1,0.5,0.4], [0.2,0.5,0.3]] 

day = ('Day1', 'Day2') 

fig = plt.figure(figsize=(10,8)) 
ax = fig.add_subplot(111) 
for x in range(0,4): #Looping through every hour 
    for y in range(0,3): #Looping through every parameter 
     if y==0: 
      ax.bar(1, status_day1[x][y],color='b',align='center') 
     elif y==1: 
      ax.bar(1, status_day1[x][y],color='r',align='center') 
     else: 
      ax.bar(1, status_day1[x][y],color='g',align='center') 
# I am assuming that the three parameters for every hour are getting stacked on top of one another   
for x in range(0,4): 
    for y in range(0,3): 
     if y==0: 
      ax.bar(1, status_day2[x][y],color='b',align='center') 
     elif y==1: 
      ax.bar(1, status_day2[x][y],color='r',align='center') 
     else: 
      ax.bar(1, status_day2[x][y],color='g',align='center') 

ax.set_xticklabels(day) 
ax.set_xlabel('Day') 
ax.set_ylabel('Hours') 
plt.show() 

私が手に望ましくない結果は次のとおりです。Incorrect plot

+0

実際に何を試してみましたか? – wflynny

+0

@wflynny、私の質問を見ていただきありがとうございます。私は最近の編集を行いました。これは、私が作った試みを大文字にするものです。 –

答えて

1

あなたのバーの下を追跡する必要があり、 matplotlibのドキュメントに積み重ね棒グラフの例を参照してください。 http://matplotlib.org/examples/pylab_examples/bar_stacked.html

また、あなたはPythonのを使用することにより、より醜いループコードのほとんどを取り除くことができますとenumerate機能だけでなく、これにより

for i in range(len(data)): 
    print(data[i]) 

の代わりに

for value in data: 
    print(value) 

私が期待される結果が得られます。

import matplotlib.pyplot as plt 

status_day1 = [ 
    [0.2, 0.3, 0.5], 
    [0.1, 0.3, 0.6], 
    [0.4, 0.4, 0.2], 
    [0.6, 0.1, 0.4], 
] 

status_day2 = [ 
    [0.1, 0.2, 0.7], 
    [0.3, 0.2, 0.5], 
    [0.1, 0.5, 0.4], 
    [0.2, 0.5, 0.3], 
] 

days = ('Day1', 'Day2') 

fig = plt.figure(figsize=(10, 8)) 
ax = fig.add_subplot(1, 1, 1) 

for day, data in enumerate((status_day1, status_day2)): 
    bottom = 0 
    for hour in data: # Looping through every hour 
     for value, color in zip(hour, ('b', 'r', 'g')): 
      ax.bar(
       day, 
       value, 
       bottom=bottom, 
       color=color, 
       align='center', 
      ) 
      bottom += value 


ax.set_xticks([0, 1]) 
ax.set_xticklabels(days) 
ax.set_xlabel('Day') 
ax.set_ylabel('Hours') 
plt.show() 
+0

MaxNoe、答えを提供してくれてありがとう、私はコードを書くよりエレガントな方法を紹介してくれてありがとう。私はまた、元のコードを変更して目的の結果を達成することができ、zipを理解して列挙していない人のために投稿します。 –

+1

残念ですが、 'zip'と' enumerate'は絶対的なpythonの基本です。あなたが何をしているのか分からないなら、それを読んでください。これは良い話です:https://www.youtube.com/watch?v=OSGv2VnC0go – MaxNoe

0

@MaxNoeはすでにジップを使用することにより、非常にエレガントな質問に答えています列挙してください。ただし、zipに精通していない人には、次のコードで目的の結果が得られます。

import matplotlib.pyplot as plt; plt.rcdefaults() 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.patches as mpatches 

status_day1 = [[0.2,0.3,0.5], [0.1,0.3,0.6], [0.4,0.4,0.2], [0.6,0.1,0.3]] 
status_day2 = [[0.1,0.2,0.7], [0.3,0.2,0.5], [0.1,0.5,0.4], [0.2,0.5,0.3]] 

xval = [0.,1.,2.] #The places where the ticks are going to be on the x-axis 

bottom_append = 0 #Counter to keep track of the bar (this is quite important) 
fig = plt.figure(figsize=(5,5)) 
ax = fig.add_subplot(111) 

for x in range(0,4): #Looping through every hour 
    for y in range(0,3): #Looping through every parameter 
     if y==0: 
      if x==0: 
       print(status_day1[x][y], bottom_append) 
       ax.bar(0, status_day1[x][y], width = 0.3, color='blue',align='center') 
       bottom_append = bottom_append+status_day1[x][y] 
      else: 
       print(status_day1[x][y], bottom_append) 
       ax.bar(0, status_day1[x][y], width = 0.3, color='blue',align='center',bottom=bottom_append) 
       bottom_append = bottom_append+status_day1[x][y] 
     elif y==1: 
      print(status_day1[x][y], bottom_append) 
      ax.bar(0, status_day1[x][y], width = 0.3, color='red',align='center', bottom=bottom_append) 
      bottom_append = bottom_append+status_day1[x][y] 
     else: 
      print(status_day1[x][y], bottom_append) 
      ax.bar(0, status_day1[x][y], width = 0.3, color='green',align='center', bottom=bottom_append) 
      bottom_append = bottom_append+status_day1[x][y] 

bottom_append = 0 
# Code is exactly same as the above, only takes into account day2 
for x in range(0,4): #Looping through every hour 
    for y in range(0,3): #Looping through every parameter 
     if y==0: 
      if x==0: 
       print(status_day2[x][y], bottom_append) 
       ax.bar(1, status_day2[x][y], width = 0.3, color='blue',align='center') 
       bottom_append = bottom_append+status_day2[x][y] 
      else: 
       print(status_day2[x][y], bottom_append) 
       ax.bar(1, status_day2[x][y], width = 0.3, color='blue',align='center',bottom=bottom_append) 
       bottom_append = bottom_append+status_day2[x][y] 
     elif y==1: 
      print(status_day2[x][y], bottom_append) 
      ax.bar(1, status_day2[x][y], width = 0.3, color='red',align='center', bottom=bottom_append) 
      bottom_append = bottom_append+status_day2[x][y] 
     else: 
      print(status_day2[x][y], bottom_append) 
      ax.bar(1, status_day2[x][y], width = 0.3, color='green',align='center', bottom=bottom_append) 
      bottom_append = bottom_append+status_day2[x][y]   


# Setting the properties of the subplot in an attempt to beautify it 
Label1 = mpatches.Patch(color='blue', label='Label1') 
Label2 = mpatches.Patch(color='green', label='Label2') 
Label3 = mpatches.Patch(color='red', label='Label3') 
ax.legend(handles=[Label1, Label2, Label3], loc=1)    
ax.set_xticks(xval)   
ax.set_xticklabels(["Day1","Day2","Day3"]) 
ax.set_xlabel('Day') 
ax.set_ylabel('Hours') 
plt.show() 
関連する問題