基于Python的seaborn比率的热图

时间:2017-03-22 08:05:24

标签: python-3.x matplotlib data-visualization heatmap seaborn

我有笛卡尔坐标数据。对于每个笛卡尔坐标,还有二进制变量。我想制作一个热图,在每个多边形(六边形/矩形等)中,颜色强度是布尔值为True的出现次数与该多边形中出现次数的比率。

数据可以是这样的:

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

我知道seaborn可以通过seaborn.heatmap生成热图,但颜色强度默认基于每个多边形的总出现次数,而不是上述比率。是否有其他绘图工具更适合?

2 个答案:

答案 0 :(得分:1)

一个选项是计算两个直方图,一个用于完整的数据帧,另一个用于为True值过滤的数据帧。然后将后者除以前者给出比率,你就是。

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

答案 1 :(得分:1)

您还可以使用pandas groupby功能来计算比率,然后将结果传递给seaborn.heatmap。从@ImportanceOfBeingErnest借来的示例数据看起来像这样:

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

如果您的xy值不是整数,则可以将它们切割为所需的分类数量:

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