首页 文章

从熊猫交叉表制作气泡图

提问于
浏览
0

我有一个4列和几千行的pandas数据帧 . 所有条目都是True或False . 让我们调用数据帧'df'和列'c0','c1','c2'和'c3' . 我感兴趣的是有多少行有2 ^ 4 = 16个可能的真值,所以我自己做了一个交叉表:

xt = pd.crosstab([df.c0,df.c1],[df.c2,df.c3])
print(xt)

这显示了一个漂亮的4x4单元格表,每个单元格包含具有真值组合的行数 . 更好的是,这16个细胞的空间布局对我来说是有意义和有用的 . 好的,一切都很好 . 但是我如何绘制呢?

具体来说,我想制作一个交叉表计数的气泡图,即交叉表数据的图形表示,与表中显示的相同的空间排列,但现在用彩色blob替换每个数字(例如,一个圆圈) )与计数成比例的面积 . 因此,这是一个散点图,其中四个(c0,c1)真值沿着一个轴,四个(c2,c3)真值沿着另一个轴,以及4x4规则网格的各种大小的圆 .

我知道我可以通过将大小数据传递给matplotlib的散射函数的's'关键字来制作气泡图,但是我无法想出一种简单的方法来告诉pandas制作一个散列图,它使用列 Headers 作为x坐标,行 Headers 为y坐标,数据值为散点图的气泡大小 . 通过将我的数据帧转换为numpy数组并绘制该数据,我获得了一些运气,但随后我从交叉表中丢失了轴标签的结构 . (是的,我可以手动重建刻度标签,但我希望能够在算法上为其他类似的数据集重现此任务 . )

编辑:灵感来自下面的@piRSquared的回答,这里有一些我要求的澄清 . 此代码接近我想要的,但结果图上的轴已丢失有关交叉表对象的分层MultiIndex标签结构的任何信息 .

import pandas as pd
import numpy as np

randomData=np.random.choice([True,False],size=(100, 4),p=[.6,.4])
df = pd.DataFrame(randomData, columns=['c0','c1','c2','c3'])
xt=pd.crosstab([df.c0,df.c1], [df.c2,df.c3])

x=np.array([range(4)]*4)
y=x.transpose()[::-1,:]
pl.scatter(x,y,s=np.array(xt)*10)

(链接到绘图图像,因为我没有足够的声誉来嵌入:a scatter plot with poorly labelled axes . )理想情况下,轴标签将具有从交叉表对象的基础MultiIndex派生的视觉上水平的结构,类似于:

c2          False       True       
c3          False True  False True 
c0    c1                           
False False     0     8     4     9
      True      3     2     4    10
True  False     7     5     3    10
      True      2     7     8    18

或者,或许,让人想起传说和x轴在这里表达的内容:

xt.plot(kind='bar',stacked=True)

(另一个情节图片链接:a stack plot that knows about the multiindex nature of its underlying dataframe . )

1 回答

  • 1

    希望这可以帮助

    df = pd.DataFrame(
        np.random.choice(
            np.arange(6),
            size=(100, 2),
            p=np.arange(1, 7) / 21
        ), columns=list('AB')
    )
    
    c = pd.crosstab(df.A, df.B).stack().reset_index(name='C')
    
    c.plot.scatter('A', 'B', s=c.C * 10)
    

    enter image description here

相关问题