【问题标题】:heatmap based on ratios in Python's seaborn基于 Python seaborn 中比率的热图
【发布时间】:2017-08-14 05:28:54
【问题描述】:

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

例如,数据可能如下所示:

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

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

【问题讨论】:

  • 链接失效(404)
  • 你看过了吗:matplotlib.org/devdocs/api/_as_gen/…(抱歉,不能再编辑旧评论了)
  • 是的,这看起来像我正在寻找的东西,但是当我运行它时出现错误:ImportError: cannot import name 'PercentFormatter'。也许是因为我使用的是 python 3?
  • 通常 matplotlib 与 Python 3 一起使用。您是否尝试过文档中的示例?无论如何,这听起来像是一个不同的问题。
  • 数据框中没有布尔变量,所以不清楚数据是什么样子的。

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


【解决方案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()

【讨论】:

  • 感谢@Gereleth,这是一个非常好的方法,我更喜欢使用 seaborn。请问一下:使用seaborn.jointplot()也可以实现吗?
  • 我不这么认为,至少不容易。 Jointplot 用于绘制双变量关系,我没有看到第三个变量的位置。如果您想将 xy 分布到热图的两侧,您可以手动修改子图。
【解决方案2】:

一个选项是计算两个直方图,一个用于完整的数据帧,一个用于过滤为 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()

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 2020-08-04
    • 2022-01-05
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2017-07-31
    相关资源
    最近更新 更多