2016-07-02 50 views
1

我有一個非常簡單的分組條形圖,每個條形圖有5組,每組4條。我用從matplotlib documentation的例子中,這是這樣的:matplotlib:如何將多條線條與線條結合

import numpy as np 
import matplotlib.pyplot as plt 

ind = np.arange(5) 
avg_bar1 = (81191,79318,57965,60557,14793) 
avg_bar2 = (26826,26615,31364,31088,55472) 
avg_bar3 = (36232,38038,38615,39014,40812) 
avg_bar4 = (26115,25879,25887,28326,27988) 

fig, ax = plt.subplots() 

rects1 = ax.bar(ind, avg_bar1, 0.15, label='bar1') 
rects2 = ax.bar(ind + 0.15, avg_bar2, 0.15, label='bar2') 
rects3 = ax.bar(ind + 0.30, avg_bar3, 0.15, label='bar2') 
rects4 = ax.bar(ind + 0.45, avg_bar4, 0.15, label='bar2') 

plt.xlabel('Distributions') 
plt.ylabel('ms') 
plt.xticks(ind + 0.15, ('50/50', '60/40', '70/30', '80/20', '90/10')) 
plt.legend() 

plt.tight_layout() 
plt.show() 

問題

但在對應的其他組的條某些值(例如,在組1和BAR1在組2 BAR1等)彼此沒有太大的差別。

我想

什麼,所以我想才能看到各組趨勢更清楚地添加行。這些行應該從一個組中的每個欄的頂部到相應其他組中的欄的頂部。

我在網上找不到任何類似的東西。

這可能嗎?

回答

0

謝謝@arsho您的輸入。我已經使它更緊湊一點。它還修復了代碼中最後一組條形的錯誤。請參閱代碼中的評論。希望這可以幫助。

對於像我這樣對matplotlib來說是新手的人:我們可以簡單地將一條線繪製到子圖上,而不管它是否已經包含條形圖。

import numpy as np 
import matplotlib.pyplot as plt 

# fig, is the whole thing; ax1 is a subplot in the figure, 
# so we reference it to plot bars and lines there 
fig, ax1 = plt.subplots() 

ind = np.arange(3) 
width = 0.15 

# per dimension 
colors = ['#00ff00', '#0000ff', '#ff00ff'] 
markers = ['x','o','v'] 
xticklabels = ['50/50', '60/40', '70/30'] 

# 
group1 = [12,6,5] 
group2 = [6,8,12] 
group3 = [2,4,9] 

# 
all_groups = [ group1, group2, group3 ] 

# plot each group of bars; loop-variable bar_values contains values for bars 
for i, bar_values in enumerate(all_groups): 

    # compute position for each bar 
    bar_position = width*i 
    ax1.bar(ind + bar_position, bar_values, width, color=colors[i]) 

# plot line for each group of bars; loop-variable y_values contains values for lines 
for i, y_values in enumerate(all_groups): 

    # moves the beginning of a line to the middle of the bar 
    additional_space = (width*i) + (width/2); 
    # x_values contains list indices plus additional space 
    x_values = [ x + additional_space for x,_ in enumerate(y_values) ] 

    # simply plot the values in y_values 
    ax1.plot(x_values, y_values, marker=markers[i], color=colors[i]) 

plt.setp([ax1], xticks=ind + width, xticklabels=xticklabels) 

plt.tight_layout() 
plt.show() 
1

我已經開始學習Matplotlibnumpy最近發現你的問題很有意思。

因此,我花時間創建了與分組條形圖相關的分組條形圖和折線圖的組合圖。

結果enter image description here

代碼:

import numpy as np 
import matplotlib.pyplot as plt 

ind = np.arange(5) 
avg_bar1 = (81191,79318,57965,60557,14793) 
avg_bar2 = (26826,26615,31364,31088,55472) 
avg_bar3 = (36232,38038,38615,39014,40812) 
avg_bar4 = (26115,25879,25887,28326,27988) 

rects1 = plt.bar(ind, avg_bar1, 0.15, color='#ff0000',label='bar1') 
rects2 = plt.bar(ind + 0.15, avg_bar2, 0.15, color='#00ff00', label='bar2') 
rects3 = plt.bar(ind + 0.30, avg_bar3, 0.15, color='#0000ff', label='bar3') 
rects4 = plt.bar(ind + 0.45, avg_bar4, 0.15, color='#000000', label='bar4') 

high_point_x = [] 
high_point_y = []  
for i in range(0,5): 
    single_bar_group={rects1[i].get_height():rects1[i].get_x() + rects1[i].get_width()/2.0, 
         rects2[i].get_height():rects2[i].get_x() + rects2[i].get_width()/2.0, 
         rects3[i].get_height():rects3[i].get_x() + rects3[i].get_width()/2.0, 
         rects4[i].get_height():rects4[i].get_x() + rects4[i].get_width()/2.0} 

    height_list = list(single_bar_group.keys()) 
    height_list.sort(reverse=True) 
    for single_height in height_list: 
     high_point_y.append(single_height) 
     high_point_x.append(single_bar_group[single_height]) 
     break 

trend_line = plt.plot(high_point_x,high_point_y,marker='o', color='#5b74a8', label='Trend Line') 

plt.xlabel('Distributions') 
plt.ylabel('ms') 
plt.xticks(ind+0.15, ('50/50', '60/40', '70/30', '80/20', '90/10')) 
plt.legend() 
plt.show()