2017-09-09 4 views
0

현재 시보를 사용하여 4 축에 걸쳐 여러 플롯을 플로팅하고 있습니다. 이렇게하기 위해 수동으로 nrows = 4를 선택한 다음 한 번에 4 개의 상자 그림을 실행합니다.python - N을 알 수없는 경우 N을 1로 플롯합니다.

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. 이 배열은 1 차원 또는 2 차원 (nrowsncols 매개 변수의 값에 따라 다름) 인 일 수 있으므로 ax.ravel()을 호출하는 것이 1 차원임을 보장하기 위해 사용됩니다. 이제 zip(label, ax.ravel())을 루프하여 sns.boxplot을 각 라벨 및 축에 대해 한 번 호출 할 수 있습니다. 반복자 최단 끝날 때 zip 종료하는 것으로

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) 

. 따라서 label의 길이가 1000 인 경우에도 은 4 축이므로 첫 번째 4 개 항목 만 루프에 사용됩니다.

label = ['A','B','C','D'] 다른 변수는 게시 된 코드가 아닌 다른 곳에서 사용되지 않았으므로 label = ['A','B','C','D']을 할당하십시오.

+0

감사합니다. 위대한 작품! ax.ravel은 1 차원임을 보장합니다. 예를 들어, 2x2 플롯이라면 이것이 다를 필요가 있다는 것을 의미합니까? –

+0

'ax.ravel()'을 사용하면'plt.subplots (nrows = 2, ncols = 2, sharey = True)'를 사용하면 코드가 을 변경할 필요가 없습니다. 이것이 단지'nrows = 4'만으로는 필요하지 않더라도'ax.ravel()'을 사용하는 이유입니다. – unutbu

+0

감사합니다. 저건 완벽 해. –