Skip to content Skip to sidebar Skip to footer

Heatmap Based On Ratios In Python's Seaborn

I have data in Cartesian coordinates. To each Cartesian coordinate there is also binary variable. I wan to make a heatmap, where in each polygon (hexagon/rectangle,etc.) the color

Solution 1:

You could also use the pandas groupby functionality to compute the ratios and then pass the result to seaborn.heatmap. With the example data borrowed from @ImportanceOfBeingErnest it would look like this:

import numpy as np
import pandas as pd
import seaborn as sns

np.random.seed(0)
x = np.random.poisson(5, size=200)
y = np.random.poisson(7, size=200)
z = np.random.choice([True, False], size=200, p=[0.3, 0.7])

df = pd.DataFrame({"x" : x, "y" : y, "z":z})
res = df.groupby(['y','x'])['z'].mean().unstack()

ax = sns.heatmap(res)
ax.axis('equal')
ax.invert_yaxis()

the resulting plot

If your x and y values aren't integers you can cut them into the desired number of categories for grouping:

bins = 10res = df.groupby([pd.cut(df.y, bins),pd.cut(df.x,bins)])['z'].mean().unstack()

Solution 2:

An option would be to calculate two histograms, one for the complete dataframe, and one for the dataframe filtered for the True values. Then dividing the latter by the former gives the ratio, you're after.

from __future__ import division
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

x = np.random.poisson(5, size=200)
y = np.random.poisson(7, size=200)
z = np.random.choice([True, False], size=200, p=[0.3, 0.7])

df = pd.DataFrame({"x" : x, "y" : y, "z":z})
dftrue = df[df["z"] == True]

bins = np.arange(0,22)
hist, xbins, ybins = np.histogram2d(df.x, df.y, bins=bins)
histtrue, _ ,__ = np.histogram2d(dftrue.x, dftrue.y, bins=bins)

plt.imshow(histtrue/hist, cmap=plt.cm.Reds)
plt.colorbar()
plt.show()

enter image description here

Post a Comment for "Heatmap Based On Ratios In Python's Seaborn"