假设我有一个包含两个重叠组的直方图。这是来自ggplot2的可能命令和假装输出图。
ggplot2(data, aes(x=Variable1, fill=BinaryVariable)) + geom_histogram(position="identity")
所以我所拥有的是每个事件的频率或数量。 我想做的是在每个垃圾箱中区分两个事件。这可能吗?怎么样?
例如,如果我们做RED减去蓝色:
我更喜欢使用ggplot2这样做,但另一种方式可以。我的数据框设置了这个玩具示例之类的项目(尺寸实际上是25000行x 30列) 已编辑:以下是使用的示例数据 GIST Example < / p>
ID Variable1 BinaryVariable
1 50 T
2 55 T
3 51 N
.. .. ..
1000 1001 T
1001 1944 T
1002 1042 N
从我的示例中可以看出,我对直方图感兴趣,可以为每个BinaryVariable(T或N)分别绘制Variable1(连续变量)。但我真正想要的是它们的频率之间的差异。
答案 0 :(得分:2)
所以,为了做到这一点,我们需要确保&#34; bins&#34;我们用于直方图的指标变量的两个级别都相同。这是一个有点天真的解决方案(在基础R
中):
df = data.frame(y = c(rnorm(50), rnorm(50, mean = 1)),
x = rep(c(0,1), each = 50))
#full hist
fullhist = hist(df$y, breaks = 20) #specify more breaks than probably necessary
#create histograms for 0 & 1 using breaks from full histogram
zerohist = with(subset(df, x == 0), hist(y, breaks = fullhist$breaks))
oneshist = with(subset(df, x == 1), hist(y, breaks = fullhist$breaks))
#combine the hists
combhist = fullhist
combhist$counts = zerohist$counts - oneshist$counts
plot(combhist)
因此我们指定应该使用多少个中断(基于完整数据上直方图的值),然后我们计算每个中断的计数差异。
PS 检查hist()
的非图形输出可能会有所帮助。
答案 1 :(得分:0)
以下是根据要求使用ggplot
的解决方案。
关键思想是使用ggplot_build
获取由stat_histogram.
计算的矩形,然后您可以计算每个bin中的差异,然后使用geom_rect.
library(ggplot2)
library(data.table)
theme_set(theme_bw())
n1<-500
n2<-500
k1 <- exp(rnorm(n1,8,0.7))
k2 <- exp(rnorm(n2,10,1))
df <- data.table(k=c(k1,k2),label=c(rep('k1',n1),rep('k2',n2)))
p <- ggplot(df, aes(x=k,group=label,color=label)) + geom_histogram(bins=40) + scale_x_log10()
ggplot_build
p_data <- as.data.table(ggplot_build(p)$data[1])[,.(count,xmin,xmax,group)]
p1_data <- p_data[group==1]
p2_data <- p_data[group==2]
newplot_data <- merge(p1_data, p2_data, by=c('xmin','xmax'), suffixes = c('.p1','.p2'))
newplot_data <- newplot_data[,diff:=count.p1 - count.p2]
setnames(newplot_data, old=c('y.p1','y.p2'), new=c('k1','k2'))
df2 <- melt(newplot_data,id.vars =c('xmin','xmax'),measure.vars=c('k1','diff','k2'))
ggplot(df2, aes(xmin=xmin,xmax=xmax,ymax=value,ymin=0,group=variable,color=variable)) + geom_rect()
当然,比例和图例仍然需要修复,但这是一个不同的主题。