【问题标题】:Plotting more than one histogram in a figure with matplotlib使用 matplotlib 在图中绘制多个直方图
【发布时间】:2016-08-13 22:46:12
【问题描述】:

我需要为辅助类中的函数编写代码,该函数将在图中绘制多个直方图。使用下面的代码,我得到 ValueError: too many values to unpack。在 for 命令行中:变量多于值,反之亦然。我做错了什么?

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  

这里是

【问题讨论】:

  • 你不显示使用 df 中的内容,所以我们无法判断。顺便说一句,您不要在函数 draw_histograms 中使用 variables。

标签: python pandas matplotlib histogram subplot


【解决方案1】:

“解包”的变量不是三个,而是只有一个,因此会出现错误(详见下文)。您可以不用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()

当您在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

【讨论】:

  • 所以这是我现在得到的 ValueError:ValueError: Layout of 3x3 must be larger than required size 30 给出错误,它确实适用于:df.hist(layout=(15,2))`,因为 15X2 是 30。我应该实现断言或错误函数?如果是这样,有什么提示吗?谢谢!
  • 您可以动态生成布局,无论如何都需要匹配图表的数量。如何做到这一点在一定程度上取决于您的方案的多样性。如果只有几个选项可用,例如{6: (3,2), 10: (5,5), 15: (5, 3)} 等,您可以只使用dictionary,并使用它来创建布局,例如layout=(layout_dict[num_charts]))。抱歉回复晚了!
  • 您需要pandas 在matplotlib 中制作直方图吗?真的有必要吗?
猜你喜欢
  • 2016-06-09
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多