Create Contour Plot from Pandas Groupby Dataframe

Balzer82 picture Balzer82 · Jun 4, 2014 · Viewed 13.5k times · Source

I have following Pandas Dataframe:

In [66]: hdf.size()
Out[66]:
a           b
0           0.0          21004
            0.1         119903
            0.2         186579
            0.3         417349
            0.4         202723
            0.5         100906
            0.6          56386
            0.7           6080
            0.8           3596
            0.9           2391
            1.0           1963
            1.1           1730
            1.2           1663
            1.3           1614
            1.4           1309
...
186         0.2         15
            0.3          9
            0.4         21
            0.5          4
187         0.2          3
            0.3         10
            0.4         22
            0.5         10
188         0.0         11
            0.1         19
            0.2         20
            0.3         13
            0.4          7
            0.5          5
            0.6          1
Length: 4572, dtype: int64

You see, a from 0...188 and b in every group from some value to some value. And as the designated Z-value, the count of the occurence of the pair a/b.

How to get a countour or heatmap plot out of the grouped dataframe?

I have this (asking for the ?):

numcols, numrows = 30, 30
xi = np.linspace(0, 200, numcols)
yi = np.linspace(0, 6, numrows)
xi, yi = np.meshgrid(xi, yi)
zi = griddata(?, ?, hdf.size().values, xi, yi)

How to get the x and y values out of the Groupby object and plot a contour?

Answer

Balzer82 picture Balzer82 · Jun 10, 2014

Thanks a lot! My fault was, that I did not realize, that I have to apply some function to the groupby dataframe, like .size(), to work with it...

hdf = aggdf.groupby(['a','b']).size()
hdf

gives me

a           b
1           -2.0          1
            -1.9          1
            -1.8          1
            -1.7          2
            -1.6          5
            -1.5         10
            -1.4          9
            -1.3         21
            -1.2         34
            -1.1         67
            -1.0         65
            -0.9         94
            -0.8        180
            -0.7        242
            -0.6        239
...
187          0.4        22
             0.5        10
188         -0.6         2
            -0.5         2
            -0.4         1
            -0.3         2
            -0.2         5
            -0.1        10
            -0.0        18
             0.1        19
             0.2        20
             0.3        13
             0.4         7
             0.5         5
             0.6         1
Length: 8844, dtype: int64

With that, and your help CT Zhu, I could then do

hdfreset = hdf.reset_index()
hdfreset.columns = ['a', 'b', 'occurrence']
hdfpivot=hdfreset.pivot('a', 'b')

and this finally gave me the correct values to

X=hdfpivot.columns.levels[1].values
Y=hdfpivot.index.values
Z=hdfpivot.values
Xi,Yi = np.meshgrid(X, Y)
plt.contourf(Yi, Xi, Z, alpha=0.7, cmap=plt.cm.jet);

which leads to this beautiful contourf:

enter image description here