从熊猫交叉表制作气泡图

时间:2017-08-31 19:55:23

标签: python pandas scatter-plot crosstab bubble-chart

我有一个包含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个细胞的空间布局对我来说是有意义和有用的。好的,一切都很好。但是我如何绘制它呢?

具体来说,我想制作这些交叉表计数的气泡图,交叉表数据的图形表示,其显示方式与表中所示的相同,但现在替换每个带有与计数成比例的区域的彩色斑点(例如,圆圈)的数字。因此,这是一个散点图,其中四个(c0,c1)真值沿着一个轴,四个(c2,c3)真值沿着另一个轴,以及4x4规则网格的各种大小的圆。

我知道我可以通过将大小数据传递给matplotlib的散射函数的's'关键字来制作气泡图,但我无法想出一种简单的方法来告诉pandas制作一个使用列标题的散点图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。)理想情况下,轴标签将具有从交叉表对象的基础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 个答案:

答案 0 :(得分:1)

希望这有帮助

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.ralfmatz.testapplication.ItemDetailActivity"
    tools:ignore="MergeRootFrame">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:toolbarId="@+id/toolbar">

            <android.support.v7.widget.Toolbar
                android:id="@+id/detail_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/item_detail_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" >

        <com.google.android.gms.maps.MapView
            android:id="@+id/mapView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|start"
        android:layout_margin="@dimen/fab_margin"
        app:layout_anchor="@+id/item_detail_container"
        app:layout_anchorGravity="top|end"
        app:srcCompat="@android:drawable/stat_notify_chat" />

</android.support.design.widget.CoordinatorLayout>

enter image description here