从熊猫交叉表制作气泡图

问题描述:

我有一个有4列和几千行的熊猫数据框。所有条目都是True或False。我们调用数据框'df'和列'c0','c1','c2'和'c3'。我感兴趣的多少行各有2^4 = 16个可能的真值的,所以我让自己交叉列表:从熊猫交叉表制作气泡图

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

显示单元的一个不错的4×4表,包含每个单元具有真值组合的行数。更好的是,这16个单元的空间布局对我来说是有意义和有用的。好,一切都很好。但我如何绘制它?

具体来说,我想制作这些交叉表计数的气泡图,图表表示与表中所示的相同空间排列中的交叉表数据,但现在用各色与计数成正比的区域(比如说一圈)。因此,这是一个散点图,其中沿着一个轴的四个(c0,c1)真值,沿着另一个轴的四个(c2,c3)真值以及不同大小的圆的4x4规则网格。

我知道我可以通过将尺寸数据传递给matplotlib分散函数的's'关键字来制作气泡图,但是我找不出一种简单的方式告诉熊猫做一个使用列标题的散点图作为x坐标,将行标题作为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)理想的轴标签将有来自交叉对象的基本多指标得出的视觉平整结构,有点像这个:

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

希望这有助于

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

+0

这接近完成工作(是真聪明!),但在一部开拓创新问题的交叉表multiindexed,这不是很明显对我来说如何推断这个答案multiIndex的情况。 –

+0

这对我来说并不明显,你希望它看起来如何。你可以画出来,拍照并发布。 – piRSquared

+0

好吧,我会编辑我的帖子,以澄清我要求的。 –