2016-04-21 90 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