我有笛卡尔坐标数据。对于每个笛卡尔坐标,还有二进制变量。我想制作一个热图,在每个多边形(六边形/矩形等)中,颜色强度是布尔值为True的出现次数与该多边形中出现次数的比率。
数据可以是这样的:
df = pd.DataFrame([[1,2,False],[-1,5,True], [51,52,False]])
我知道seaborn
可以通过seaborn.heatmap生成热图,但颜色强度默认基于每个多边形的总出现次数,而不是上述比率。是否有其他绘图工具更适合?
答案 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()
答案 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()
如果您的x
和y
值不是整数,则可以将它们切割为所需的分类数量:
bins = 10
res = df.groupby([pd.cut(df.y, bins),pd.cut(df.x,bins)])['z'].mean().unstack()