天天看点

python seaborn 热图_基于Python的seaborn中的比率的热图

python seaborn 热图_基于Python的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 strength is the ratio of number of occurrences where the boolean is True out of the total occurrences in that polygon.

The data can for example look like this:

df = pd.DataFrame([[1,2,False],[-1,5,True], [51,52,False]])

I know that seaborn can generate heatmaps via seaborn.heatmap, but the color strength is based by default on the total occurrences in each polygon, not the above ratio. Is there perhaps another plotting tool that would be more suitable?

解决方案

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()

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

bins = 10

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