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
相关产品推荐
相关产品推荐

