如何在Julia中使用单位直方图?

如何在Julia中使用单位直方图?,julia,composition,Julia,Composition,我正试图找出如何在Julia中对一组数据进行装箱/柱状图处理。我有一个来自Unitful.jl包的单位数组,我想使用StatsBase中的Histogram来存储数据。我得到的第一个错误是说没有方法让log10使用Unitful.FreeUnits,所以我写了一个。现在我得到一个尺寸误差。我以为Unitful会和其他东西一起工作。。我想不是。以下是我所处的位置 using Unitful using StatsBase data = [rand()*100*1u"MHz"

我正试图找出如何在Julia中对一组数据进行装箱/柱状图处理。我有一个来自
Unitful.jl
包的单位数组,我想使用
StatsBase
中的
Histogram
来存储数据。我得到的第一个错误是说没有方法让
log10
使用
Unitful.FreeUnits
,所以我写了一个。现在我得到一个尺寸误差。我以为Unitful会和其他东西一起工作。。我想不是。以下是我所处的位置

using Unitful
using StatsBase

data = [rand()*100*1u"MHz" for x in 1:10000]

function Base.log10(x::Quantity{})
    u = unit(x)
    return log10(x.val)u
end

# eventually I want to define my bin width manually.. but this is a start.
fit(Histogram, data)

错误

ERROR: DimensionError: 0.0 and 0.8237981449864736 MHz are not dimensionally compatible.
Stacktrace:
 [1] _lt at /home/mcamp/.julia/packages/Unitful/1t88N/src/quantities.jl:274 [inlined]
 [2] <(::Quantity{Float64,NoDims,Unitful.FreeUnits{(),NoDims,nothing}}, ::Quantity{Float64,[EDITED because I misunderstood the question]

Are you looking to plot a histogram of the data? If yes, instead of StatsBase.jl, I would use the
histogram
function of a plotting package like Plots.jl. For instance, to combine plots from Plots.jl with units from Unitful.jl, you can use the UnitfulRecipes.jl package. See this MWE that may be what you are after:

using Unitful: MHz
using Plots
using UnitfulRecipes
data = 100 * exp.(randn(10000)) * MHz
histogram(data)
错误:尺寸错误:0.0和0.8237981449864736 MHz在尺寸上不兼容。
堆栈跟踪:
[1] \u lt at/home/mcamp/.julia/packages/Unitful/1t88N/src/quantities.jl:274[内联]

[2] [由于我误解了问题而编辑]

您是否希望绘制数据的柱状图?如果是,我将使用Plots.jl之类的绘图包的
直方图
功能,而不是StatsBase.jl。例如,要将plots.jl中的绘图与Unitful.jl中的单位组合在一起,可以使用软件包。看看这个MWE,这可能就是你想要的:

using Unitful: MHz
using StatsBase
data = 100 * rand(10000) * MHz
data_nodim = log10.(data / MHz) # <- this is valid
fit(Histogram, data_nodim)      # <- this is valid too
将输出


[编辑前]

我认为,无论从数学上还是物理上讲,取无量纲变量(即带单位的变量)的对数都没有意义。也就是说,您对
log10
的重新定义不是一个好主意。相反,我会在获取日志之前对数据进行无量纲化,类似于

使用单位频率:MHz
使用StatsBase
数据=100*兰特(10000)*兆赫

data_nodim=log10(data/MHz)#这不是我想要做的。。我想用单位来存储数据或柱状图数据。比如说我有一个1000兆赫兹的测量阵列,范围是40MHz到1000Mhz。我想对数据进行分类,以便了解其分布情况。我不确定
StatsBase
如何使用
log10
。。但我只是想知道如何让这东西工作。也许我只需要修改得到的柱状图,并将其边缘更改为单位或其他东西……哦,我明白了,我也看到了你的帖子。我会在那里插话:)实际上我会先在这里回答,通过编辑我的答案:)