2017-04-23 256 views
1

我想迭代列表並繪製每個列表的箱形圖。因爲數據不能全部放入內存中,所以我無法指定預定義的箱數來繪製,所以我使用子圖函數迭代地添加圖。matplotlib subplot boxplot隱藏一些軸標籤

我的問題是軸標籤沒有被添加到boxplot圖中,只顯示最後一個標籤。如何用子圖迭代地標記箱形圖。

下面是我想要做的簡化示例。儘管實際上我實際上是在循環中循環使用同一個列表,而不是迭代列表的列表,但它可以用來說明問題。由於可以看到只有'lb'被設置在yaxis中,並且第一個底部盒子圖沒有顯示'la',所以

謝謝。

%matplotlib inline 
import matplotlib.pyplot as plt 

la = [24, 28, 31, 34, 38, 40, 41, 42, 43, 44] 
lb = [5, 8, 10, 12, 15, 18, 21, 25, 30, 39] 
names = ['la', 'lb'] 
myList = [la] + [lb] 
myList 

# set fig for boxplots 
fig, ax = plt.subplots(sharex=True) 
# Add a horizontal grid to the plot 
ax.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5) 
ax.set_axisbelow(True) 
ax.set_title('Some Title') 

for i,l in enumerate(myList): 
    ax.boxplot(l, vert=False, positions = [i]) 
    ax.set_yticklabels([names[i]]) 

ax.set_ylim(-0.5, len(myList)-0.5) 

/Users/pmca/Desktop/Screen_Shot_2017-04-23_at_16.24.25.png

回答

2

設置標籤內環路將覆蓋前面ticklabel。所以標籤應該設置在循環之外。您還需要確保兩個標籤實際上都有滴答聲。

一種解決方案是,因此添加

ax.set_yticks(range(len(myList))) 
ax.set_yticklabels(names) 

外循環。

完整代碼:

import matplotlib.pyplot as plt 

la = [24, 28, 31, 34, 38, 40, 41, 42, 43, 44] 
lb = [5, 8, 10, 12, 15, 18, 21, 25, 30, 39] 
names = ['la', 'lb'] 
myList = [la] + [lb] 
myList 

# set fig for boxplots 
fig, ax = plt.subplots(sharex=True) 
# Add a horizontal grid to the plot 
ax.xaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5) 
ax.set_axisbelow(True) 
ax.set_title('Some Title') 

for i,l in enumerate(myList): 
    ax.boxplot(l, vert=False, positions = [i]) 

ax.set_yticks(range(len(myList))) 
ax.set_yticklabels(names) 

ax.set_ylim(-0.5, len(myList)-0.5) 

plt.show() 

enter image description here

+0

大。之前我曾嘗試過類似的東西,但沒有設置刻度,結果與我的問題相同。所以我會引用你的句子「你還需要確保兩個標籤都有滴答作響。」這是必要的。 – PedroA

+0

的確如此。完成。 – PedroA