经过一番修补后,我没有找到解决方案,而是找到了错误的根源。
它位于mosaicplot-class/-module的代码中:http://nipy.bic.berkeley.edu/nightly/statsmodels/doc/html/_modules/statsmodels/graphics/mosaicplot.html http://nipy.bic.berkeley.edu/nightly/statsmodels/doc/html/_modules/statsmodels/graphics/mosaicplot.html
简而言之:它无法处理数据集中的类,这些类是空的,即有 0 个实例。
考虑原始问题中的数据集,然后考虑以下函数调用:
mosaic(data, ['Married', 'No. of Children'])
“马赛克”方法要做的就是确定第一个类别有多少个类(在本例中为:2),然后确定每个类出现的频率。然后,它将基于此生成绘图矩形的“比例”列表,在“已婚”类别的情况下,该列表将是
[2, 9]
...因为有 2 个“是”和 9 个“否”实例。
对于每个类别,根据第二个类别,都会有新的划分,此处:“不。孩子的'。有 3 个类别(0、1 和 2),这将生成以下“比例”:
[1, 1, 0](1 已婚,有 0 个孩子,1 已婚,有 1 个孩子,0 已婚,有 2 个孩子)
[2, 4, 3](1 个单身,0 个孩子,等等......)
仅根据以上内容,就能够绘制出完美精细的马赛克图。
然而,一旦我们考虑到第三个类别(例如:“性别”),上述列表之一中的 0 就会成为问题。它将生成列表 [0, 0],因为他们是 0 个已婚男性/女性,有 2 个孩子。
在源代码的第 45 行中,有一个 if 子句将在所有 0 列表中引发异常(因为它们“没有意义”)。
如上所述,我无法找到修复/解决方法来执行此操作。简单地注释掉 if 子句将允许所有分割正常执行,但是,这也会导致马赛克图的绘制在 matplotlib 的 backend_agg.py 中抛出异常,因为不知何故它们现在是 NaN 值(不是数字)。
为什么会这样,我不知道,如果有比我更聪明、更有经验的人来研究这个问题,我会很高兴。
我仍然不排除我只需以不同的方式设置一些参数即可。