Return Julia 中二维直方图的 bin 中的频率
Return the frequency in a bin of a 2D histogram in Julia
假设我有一些二维数据点,使用 Julia 中的 Plots 包,可以轻松绘制二维直方图。我的任务是定义一个函数,该函数将数据点映射到该点所属的 bin 的数据点频率。是否有任何功能可以很好地完成这项任务?
例如,如下面的二维直方图:
并且我想定义一个函数,当我输入一个在这个直方图范围内的任意数据点时,该函数将输出相应bin的频率。在上图中,当我输入 (0.1, 0.1)
时,函数应该输出 375
(我想那里最亮的网格代表 375
的频率)。 Julia中有没有方便的函数来完成上述任务?
编辑:
using Plots
gr()
histogram2d(randn(10000), randn(10000), nbins=20)
直方图是根据标准正态分布生成的 10000 个二维数据点创建的。 Julia中有没有输入一个二维点,输出该点所属bin的频率的函数?可以通过创建数组和 bin 并计算输入数据点的 bin 中的元素数量来自己编写一个,但这将是一种乏味的方法。
我不是 100% 确定这是否是 StatsPlots 正在做的事情,但一种方法可能是使用适用于 N 维的 StatsBase 直方图:
using StatsBase, StatsPlots, Distributions
# Example data
data = (randn(10_000), randn(10_000))
# Plot StatsPlots 2D histogram
histogram2d(data)
# Fit a histogram with StatsBase
h = fit(Histogram, data)
x = searchsortedfirst(h.edges[1], 0.1) # returns 10
y = searchsortedfirst(h.edges[2], 0.1) # returns 11
h.weights[x, y] # returns 243
# Or as a function
function get_freq(h, xval, yval)
x = searchsortedfirst(h.edges[1], xval)
y = searchsortedfirst(h.edges[2], yval)
h.weights[x, y]
end
get_freq(h, 1.4, 0.6) # returns 32
假设我有一些二维数据点,使用 Julia 中的 Plots 包,可以轻松绘制二维直方图。我的任务是定义一个函数,该函数将数据点映射到该点所属的 bin 的数据点频率。是否有任何功能可以很好地完成这项任务?
例如,如下面的二维直方图:
并且我想定义一个函数,当我输入一个在这个直方图范围内的任意数据点时,该函数将输出相应bin的频率。在上图中,当我输入 (0.1, 0.1)
时,函数应该输出 375
(我想那里最亮的网格代表 375
的频率)。 Julia中有没有方便的函数来完成上述任务?
编辑:
using Plots
gr()
histogram2d(randn(10000), randn(10000), nbins=20)
直方图是根据标准正态分布生成的 10000 个二维数据点创建的。 Julia中有没有输入一个二维点,输出该点所属bin的频率的函数?可以通过创建数组和 bin 并计算输入数据点的 bin 中的元素数量来自己编写一个,但这将是一种乏味的方法。
我不是 100% 确定这是否是 StatsPlots 正在做的事情,但一种方法可能是使用适用于 N 维的 StatsBase 直方图:
using StatsBase, StatsPlots, Distributions
# Example data
data = (randn(10_000), randn(10_000))
# Plot StatsPlots 2D histogram
histogram2d(data)
# Fit a histogram with StatsBase
h = fit(Histogram, data)
x = searchsortedfirst(h.edges[1], 0.1) # returns 10
y = searchsortedfirst(h.edges[2], 0.1) # returns 11
h.weights[x, y] # returns 243
# Or as a function
function get_freq(h, xval, yval)
x = searchsortedfirst(h.edges[1], xval)
y = searchsortedfirst(h.edges[2], yval)
h.weights[x, y]
end
get_freq(h, 1.4, 0.6) # returns 32