2016-04-21 6 views
4

Мне нужно написать код для функции в классе-помощнике, который будет рисовать несколько гистограмм на рисунке. С кодом, который у меня ниже, я получаю ValueError: слишком много значений для распаковки. в командной строке: есть больше переменных, чем значений, или наоборот. Что я делаю не так?Построение более одной гистограммы на фигуре с 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) 

Это то, что ДФ выглядит. Переменные не включают их всех, поскольку неактуальные были отброшены.

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

Вы не»шоу использовать то, что в ФР, поэтому мы не можем сказать. Кстати, вы не используете 'переменные' в своей функции' draw_histograms'. – roadrunner66

ответ

3

Есть не три, а только одна переменная «распаковать», следовательно, ошибка (см ниже подробно). Вероятно, вы можете обойтись без цикла for, потому что df.hist() имеет параметр layout, который позволяет вам определить то же самое, используя параметры (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

Когда перебирать df в петле for: только

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. Должен ли я реализовать функцию assert или error? Если да, то какие-нибудь советы? Благодаря! – squidvision

+1

Вы можете генерировать макет динамически, в любом случае необходимо сопоставить количество графиков. Как это сделать, это немного зависит от того, насколько разнообразен ваш сценарий. Вы можете просто использовать словарь, если доступно несколько вариантов, например '{6: (3,2), 10: (5,5), 15: (5, 3)}' и т. Д., И используйте это для создайте макет, например 'layout = (layout_dict [num_charts])). Извините за поздний ответ! – Stefan

Смежные вопросы