You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia中不用fit函数、仅用Histogram()如何绘制两个直方图的差值

Julia绘制两组直方图差值的实现方案

问题说明

你之前通过fit(Histogram...)结合.weights属性可以实现两组直方图的差值绘制,现有需求是仅通过Histogram()方法实现相同效果:

  • 之前可用的实现逻辑:先通过fit方法统计得到两组数据的直方图实例,提取权重计算差值后绘制柱状图
  • 现有约束:无法使用fit方法,当前调用的histogram()返回的对象没有.weights属性

实现方案

首先明确:你当前调用的histogram()是Plots库提供的绘图接口,返回的是绘图对象,本身不存储直方图的统计权重数据,你可以通过以下两种方式实现差值绘制:

方案1:直接构造Histogram实例统计权重再绘图

完全不使用fit方法,直接调用Histogram()构造函数统计权重,再统一绘图:

using Plots
using StatsBase

# 假设Group1、Group2为你的原始数据,B为指定的bin区间
# 直接构造Histogram实例统计两组数据的bin计数
counts1 = [sum(B[i] ≤ x < B[i+1] for x in Group1) for i in 1:length(B)-1]
h1_stats = Histogram(B, counts1, :left)
counts2 = [sum(B[i] ≤ x < B[i+1] for x in Group2) for i in 1:length(B)-1]
h2_stats = Histogram(B, counts2, :left)

# 计算概率归一化的差值
diff = h2_stats.weights/length(Group2) - h1_stats.weights/length(Group1)

# 绘制两张子图
p1 = histogram(Group1, bins= B, normalize =:probability, label = "Group 1", α=0.5)
histogram!(p1, Group2, bins= B, normalize =:probability, label ="Group 2", α=0.5)
p2 = bar(B[1:end-1], diff, label="diff", xticks=B)

plot(p1, p2, layout=(2,1))

方案2:从现有绘图对象提取数据计算差值

如果你已经生成了h1、h2两个绘图对象,可以直接从对象中提取bin和计数数据:

using Plots
using StatsBase   

h1 = histogram(Group1, bins= B, normalize =:probability, label = "Group 1")
h2 = histogram(Group2, bins= B, normalize =:probability, label ="Group 2")

# 从绘图对象提取归一化后的计数数据
counts1 = h1.series_list[1][:y]
counts2 = h2.series_list[1][:y]
diff = counts2 - counts1
# 获取bin的左边界坐标
bins = h1.series_list[1][:x]

# 绘制差值图
p2 = bar(bins, diff, label="diff")
plot(h1, p2, layout=(2,1))

最终实现效果参考下图:
效果示意图

内容的提问来源于stack exchange,提问作者jvm.97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 15:06:03