【问题标题】:Python 3 - how to make mosaic plots from higher-dimensional data?Python 3 - 如何从高维数据制作马赛克图?
【发布时间】:2015-12-01 07:59:15
【问题描述】:

我有一个 pandas-DataFrame:

data = pd.read_csv(r'C:\data-path\demographics.csv', sep=',') print(data)

PersonID Married No. of Children Sex 1 yes 0 male 2 no 0 female 3 no 1 male 4 yes 1 male 5 no 1 female 6 no 2 female 7 no 1 male 8 no 2 male 9 no 2 male 10 no 1 male 11 no 0 female

现在我尝试使用statsmodels.graphics.mosaicplot创建一个马赛克图

mosaic(data, ['Married', 'No. of Children'])

...但是,每当我尝试添加第三个维度时,它都会起作用,例如:

mosaic(data, ['Married', 'No. of Children', 'Sex'])

...我收到以下错误消息:

ValueError: at least one proportion should begreater than zero

我不确定,它想从我这里得到什么。是否缺少某些参数/设置错误?

我选择哪些列/维度或按什么顺序也无关紧要。每当我有超过 2 个时,我都会收到错误消息。

有人有想法吗?

提前致谢

【问题讨论】:

  • 经过进一步研究,我遇到了以下问题:photo.etangkk.com/Python/blog-03.asp。在页面底部附近,还有 3 个变量的马赛克图。我自己尝试了代码,它确实有效!她和我的代码最大的区别是什么?她的数据实际上比我的要复杂得多……有人知道这里发生了什么吗?
  • 另一种方法见here

标签: python python-3.x pandas plot


【解决方案1】:

经过一番修补后,我没有找到解决方案,而是找到了错误的根源。

它位于镶嵌图类/模块的代码中: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 的值(不是数字)。

为什么会这样,我不知道,如果有人比我更聪明,更有经验,我会很高兴。

我仍然不排除我只需要设置一些不同的参数。

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2017-11-20
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多