2016-04-21 149 views
4

我需要在輔助類中爲函數編寫代碼,該類將在圖中繪製多個直方圖。用我下面的代碼,我得到ValueError:太多的值來解壓。在for命令行中:有多個變量而不是值,反之亦然。我究竟做錯了什麼?用matplotlib在圖中繪製多個直方圖

def draw_histograms(df, variables, n_rows, n_cols): 
    fig = plt.figure() 
    for n_rows, n_cols, plot_number in df: 
     fig.add_subplot(n_rows, n_cols, plot_number) 
    plt.show() 

     """ variables includes a list of variables you need to draw histograms for. 
n_rows and n_cols specifies the number of subplots you need to have in a figure. 
If n_rows =3 and n_cols =2, there will 3*2 = 6 subplots placed in a grid of 3 rows and 2 columns. 
subplot(321) is identical to subplot(3,2,1), which refers to the 1st subplot in a grid of 3 rows and 2 columns""" 

util.draw_histograms(df, variables = ['DerogCnt', 'CollectCnt', 'InqCnt06', 'InqTimeLast', 'InqFinanceCnt24', 'TLTimeFirst', 'TLTimeLast', 'TLCnt03', 'TLCnt12'], 3,3) 

這是DF模樣。 變量不包含全部內容,因爲不相關的內容已被刪除。

TARGET ID DerogCnt CollectCnt BanruptcyInd InqCnt06 InqTimeLast \ 
0  0 66   1   1    0   7   1 
1  0 116   1   1    0   2   1 
2  0 124   0   0    0   1   1 
3  0 128   0   0    0   6   3 
4  0 143   0   0    0   1   0 
    InqFinanceCnt24 TLTimeFirst TLTimeLast  ...  TL50UtilCnt \ 
0    4   125   3  ...     4 
1    0   252   18  ...     2 
2    4   254   12  ...     3 
3    6   154   3  ...     5 
4    1   311   17  ...     3 

    TLBalHCPct TLSatPct TLDel3060Cnt24 TLDel90Cnt24 TLDel60CntAll \ 
0  0.85  0.67    0    0    1 
1  0.48  0.30    0    1    4 
2  0.84  0.67    0    1    1 
3  0.73  0.76    0    1    1 
4  0.88  0.63    0    0    1 

    TLOpenPct TLBadDerogCnt TLDel60Cnt24 TLOpen24Pct 
0  0.58    0    0   0.71 
1  0.40    2    1   0.50 
2  0.50    1    1   0.33 
3  0.53    1    1   1.22 
4  0.63    0    0   0.20 

這裏的

+2

你不'顯示使用什麼在DF,所以我們不能告訴。順便說一句,你不要在'draw_histograms'函數中使用'variables'。 – roadrunner66

回答

3

有不是三個,但只有一個變量「解壓」,因此錯誤(見下面詳細)。因爲df.hist()具有layout參數,所以您可以不使用for循環,因爲您可以使用參數(n_row, n_col)定義相同的參數。

df = pd.DataFrame(data=np.random.random(size=(50, 6)), columns=[i for i in string.ascii_lowercase[:6]]) 
df.hist(layout=(3,2)) 
plt.show() 

enter image description here

當您在for循環遍歷df:只有

for n_rows, n_cols, plot_number in df: 

df回報每次迭代,即column名稱的單值。

見例如:

df = pd.DataFrame(data=np.random.random(size=(5, 5)), columns=[i for i in string.ascii_lowercase[:5]]) 

print([i for i in df]) 

['a', 'b', 'c', 'd', 'e'] 

ValueError提高,因爲n_rows, n_cols, plot_number暗示會有每次迭代中解壓三個值。與for ... in df.items(),例如,你會得到兩個值 - 列名和數據:

for i, col in df.items(): 
    print('\n', i) 
    print(col) 

a 
0 0.640400 
1 0.683003 
2 0.807806 
3 0.767698 
4 0.648523 
Name: a, dtype: float64 

b 
0 0.774166 
1 0.052386 
2 0.235688 
3 0.018334 
4 0.492798 
Name: b, dtype: float64 

c 
0 0.390146 
1 0.383680 
2 0.588734 
3 0.911859 
4 0.901137 
Name: c, dtype: float64 

d 
0 0.455289 
1 0.626278 
2 0.977627 
3 0.311236 
4 0.570580 
Name: d, dtype: float64 

e 
0 0.782046 
1 0.041161 
2 0.226500 
3 0.331402 
4 0.942302 
Name: e, dtype: float64 
+0

所以這是我現在得到的ValueError:'ValueError:3x3的佈局必須大於所需的大小30'給出錯誤,它適用於:df.hist(layout =(15,2))',因爲15X2是30.我應該實現斷言還是錯誤功能?如果是這樣,任何提示?謝謝! – squidvision

+1

您可以動態生成佈局,無論如何需要匹配圖表數量。如何做到這一點取決於你的場景的多樣性。如果只有少數選項可用,例如'{6:(3,2),10:(5,5),15:(5,3)}'等,則可以使用「字典」,並將其用於創建佈局,如'layout =(layout_dict [num_charts]))'。回覆晚了非常抱歉! – Stefan