Python 从pandas交叉表制作气泡图

Python 从pandas交叉表制作气泡图,python,pandas,scatter-plot,crosstab,bubble-chart,Python,Pandas,Scatter Plot,Crosstab,Bubble Chart,我有一个包含4列和几千行的熊猫数据框架。所有条目要么为真,要么为假。让我们调用数据帧“df”和列“c0”、“c1”、“c2”和“c3”。我感兴趣的是2^4=16个可能的真值中有多少行,所以我自己做了一个交叉列表: xt = pd.crosstab([df.c0,df.c1],[df.c2,df.c3]) print(xt) 这将显示一个漂亮的4x4单元格表,每个单元格包含具有该真值组合的行数。更好的是,这16个单元的空间布局对我来说是有意义和有用的。好的,一切都好。但我该怎么画呢 具体地说,我

我有一个包含4列和几千行的熊猫数据框架。所有条目要么为真,要么为假。让我们调用数据帧“df”和列“c0”、“c1”、“c2”和“c3”。我感兴趣的是2^4=16个可能的真值中有多少行,所以我自己做了一个交叉列表:

xt = pd.crosstab([df.c0,df.c1],[df.c2,df.c3])
print(xt)
这将显示一个漂亮的4x4单元格表,每个单元格包含具有该真值组合的行数。更好的是,这16个单元的空间布局对我来说是有意义和有用的。好的,一切都好。但我该怎么画呢

具体地说,我想制作一个关于这些交叉表计数的气泡图,即以与表中所示相同的空间排列的交叉表数据的图形表示,但现在将每个数字替换为与计数成比例的彩色斑点(例如,一个圆)。这是一个散点图,沿着一个轴有四个(c0,c1)真值,沿着另一个轴有四个(c2,c3)真值,还有一个4x4大小不同的圆形规则网格

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

编辑:受以下@piRSquared答案的启发,我想澄清一下我的要求。这段代码接近我想要的,但是结果图上的轴丢失了关于交叉表对象的分层多索引标签结构的任何信息

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)
(链接到绘图图像,因为我没有足够的声誉来嵌入:)理想情况下,轴标签将具有从交叉表对象的基础多索引派生的视觉水平结构,类似于:

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)
(另一个绘图图像链接:)

希望这有帮助

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)

这几乎完成了任务(而且真的很聪明!),但原始问题中的交叉表是多索引的,我不清楚如何将此答案推断到多索引情况。我不清楚您希望它看起来如何。你能画出来,拍张照片并贴出来吗?好的,我会编辑我的帖子来澄清我的要求。