2017-09-09 22 views
0

我目前跨4個軸使用seaborn繪製多條曲線。爲了做到這一點,我手動選擇nrows = 4,然後一次運行4個箱形圖。蟒 - 由1號地塊繪製當n N是未知

import pandas as pd 
import numpy as np 
import seaborn as sns 
%matplotlib inline 

data=np.random.randn(1000) 
label = ['A','B','C','D'] * 250 

df = pd.DataFrame(
{'label': prod1, 
'data': data 
}) 

fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4, sharey=True) 
fig.set_size_inches(12, 16) 

sns.boxplot(data=df[df['label']=='A'], y='data', ax=ax1) 
sns.boxplot(data=df[df['label']=='B'], y='data', ax=ax2) 
sns.boxplot(data=df[df['label']=='C'], y='data', ax=ax3) 
sns.boxplot(data=df[df['label']=='D'], y='data', ax=ax4) 

我想改寫這個功能,因此它會自動識別標籤的唯一編號,自動創建軸的數量,然後地塊。

有誰知道我該如何做到這一點?謝謝。

回答

1

分配

fig, ax = plt.subplots(nrows=4, sharey=True) 

makes ax a NumPy array of axes。此陣列可以是一維或二維(取決於nrowsncols參數的值),所以 主叫ax.ravel()用於確保它是一維的。 現在,您可以循環使用zip(label, ax.ravel()),爲每個標籤和座標軸調用sns.boxplot一次。

fig, ax = plt.subplots(nrows=4, sharey=True) 
fig.set_size_inches(12, 16) 
for labeli, axi in zip(label, ax.ravel()): 
    sns.boxplot(data=df[df['label']==labeli], y='data', ax=axi) 

請注意,zip結束時,迭代器中最短的結束。因此,即使 label具有長度1000,僅前4個條目中的循環,因爲有 使用的是隻有4個軸。

或者,只是分配label = ['A','B','C','D']因爲該變量不使用其他任何地方(至少,不會在發佈的代碼)。

+0

謝謝!很棒!你提到ax.ravel確保它是1維的。這是否意味着,如果它是2x2情節,這需要有所不同? –

+0

通過使用'ax.ravel()'的代碼不會有,如果你使用'plt.subplots(NROWS = 2,NCOLS = 2,sharey = TRUE)'改變 。這就是使用'ax.ravel()'的原因,即使它不是'nrows = 4'所必需的。 – unutbu

+0

謝謝。那很完美。 –

相關問題