我有一组 X、Y 数据点(大约 10k),它们很容易绘制为散点图,但我想将其表示为热图。
我查看了 Matplotlib 中的示例,它们似乎都已经从热图单元值开始生成图像。
有没有一种方法可以将一堆不同的 x、y 转换为热图(x、y 频率较高的区域会“更暖”)?
原文由 greye 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一组 X、Y 数据点(大约 10k),它们很容易绘制为散点图,但我想将其表示为热图。
我查看了 Matplotlib 中的示例,它们似乎都已经从热图单元值开始生成图像。
有没有一种方法可以将一堆不同的 x、y 转换为热图(x、y 频率较高的区域会“更暖”)?
原文由 greye 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 Matplotlib 词典中,我认为你想要一个 hexbin 图。
如果您不熟悉这种类型的图,它只是一个 _二元直方图_,其中 xy 平面由规则的六边形网格镶嵌而成。
因此,从直方图中,您可以只计算落在每个六边形中的点数,将绘图区域离散化为一组 _窗口_,将每个点分配给这些窗口中的一个;最后,将窗口映射到一个 颜色数组 上,您就得到了一个 hexbin 图。
虽然不像圆形或正方形那样常用,但六边形是装箱容器几何形状的更好选择是直观的:
六边形具有 _最近邻对称性_(例如,方块不具有,例如, 从 正方形边界 上 的点到该正方形内部的点的距离并非处处相等)和
六边形是提供 规则平面镶嵌 的最高 n 多边形(即,您可以安全地用六边形瓷砖重新建模厨房地板,因为完成后瓷砖之间不会有任何空隙——不适用于所有其他更高的 n,n >= 7,多边形)。
( Matplotlib 使用术语 hexbin 图;(AFAIK) R 的所有 绘图库 也是如此;我仍然不知道这是否是此类图的普遍接受的术语,尽管我怀疑这很可能是因为 hexbin 很短对于 _六角分箱_,它描述了准备显示数据的基本步骤。)
from matplotlib import pyplot as PLT
from matplotlib import cm as CM
from matplotlib import mlab as ML
import numpy as NP
n = 1e5
x = y = NP.linspace(-5, 5, 100)
X, Y = NP.meshgrid(x, y)
Z1 = ML.bivariate_normal(X, Y, 2, 2, 0, 0)
Z2 = ML.bivariate_normal(X, Y, 4, 1, 1, 1)
ZD = Z2 - Z1
x = X.ravel()
y = Y.ravel()
z = ZD.ravel()
gridsize=30
PLT.subplot(111)
# if 'bins=None', then color of each hexagon corresponds directly to its count
# 'C' is optional--it maps values to x-y coordinates; if 'C' is None (default) then
# the result is a pure 2D histogram
PLT.hexbin(x, y, C=z, gridsize=gridsize, cmap=CM.jet, bins=None)
PLT.axis([x.min(), x.max(), y.min(), y.max()])
cb = PLT.colorbar()
cb.set_label('mean value')
PLT.show()
原文由 doug 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
如果你不想要六边形,你可以使用 numpy 的
histogram2d
函数:这制作了一个 50x50 的热图。如果你想要 512x384,你可以把
bins=(512, 384)
放在对histogram2d
的调用中。例子: