R Normalize 然后在 R 中一起绘制两个直方图

Posted

技术标签:

【中文标题】R Normalize 然后在 R 中一起绘制两个直方图【英文标题】:R Normalize then plot two histograms together in R 【发布时间】:2015-05-31 00:13:59 【问题描述】:

我意识到已经有几篇帖子让人们询问如何将两个直方图并排绘制在一起(如在一个图中,条形彼此相邻)并覆盖在 R 中,以及如何规范化数据。按照我找到的建议,我可以执行其中一项操作,但不能同时执行两项操作。

这是设置。 我有两个不同长度的数据框,并且想将每个 df 中对象的体积绘制为直方图。例如,数据帧 1 中有多少在 .1-.2 um^3 之间,并将其与数据帧 2 中有多少在 .1 和 .2 um^3 之间进行比较,依此类推。重叠或并排这样做会很好。

由于一个数据帧中的测量值比另一个数据帧多,显然我必须进行归一化,所以我使用:

read.csv(ctl)
read.csv(exp)
h1=hist(ctl$Volume....)
h2=hist(exp$Volume....

#to normalize#

h1$density=h1$counts/sum(h1$counts)*100
plot(h1,freq=FALSE....)
h2$density=h2$counts/sum(h2$counts)*100
plot(h2,freq=FALSE....)

现在我已经成功地使用这种方法覆盖了未标准化的数据:http://www.r-bloggers.com/overlapping-histogram-in-r/,也使用这种方法:plotting two histograms together

但是在如何覆盖规范化数据方面我被卡住了

【问题讨论】:

“并排”是什么意思?两个不同的图彼此相邻 (par(mfrow=c(1,2)) 还是一个图有 2 个不同的条彼此相邻? 一个情节有两个不同的条,抱歉不清楚。 我不知道 $Volume 是什么,我假设它是您想要规范化的向量。这很麻烦,但是在数据框中创建一个新向量,其中 ctl$density 【参考方案1】:

ggplot2 使得绘制大小不等组的归一化直方图变得相对简单。这是一个假数据的例子:

library(ggplot2)

# Fake data (two normal distributions)
set.seed(20)
dat1 = data.frame(x=rnorm(1000, 100, 10), group="A")
dat2 = data.frame(x=rnorm(2000, 120, 20), group="B")
dat = rbind(dat1, dat2)

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_histogram(breaks=seq(0,200,5), alpha=0.6, 
                 position="identity", lwd=0.2) +
  ggtitle("Unormalized")

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_histogram(aes(y=..density..), breaks=seq(0,200,5), alpha=0.6, 
                 position="identity", lwd=0.2) +
  ggtitle("Normalized")

如果您想制作叠加密度图,您也可以这样做。 adjust 控制带宽。默认情况下,这已经标准化。

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_density(alpha=0.4, lwd=0.8, adjust=0.5) 

更新:为了回答您的评论,下面的代码应该可以做到这一点。 (..density..)/sum(..density..) 导致两个直方图上的总密度加起来为 1,每个单独组的总密度加起来为 0.5。因此,您必须乘以 2,以便将每个组的总密度单独归一化为 1。通常,您必须乘以 n,其中 n 是组数。这似乎有点笨拙,可能有更优雅的方法。

library(scales) # For percent_format()

ggplot(dat, aes(x, fill=group, colour=group)) +
  geom_histogram(aes(y=2*(..density..)/sum(..density..)), breaks=seq(0,200,5), alpha=0.6, 
                 position="identity", lwd=0.2) +
  scale_y_continuous(labels=percent_format())

【讨论】:

工作出色,非常感谢。我唯一的额外问题是是否可以让标准化 ggplot 的 y 轴代表百分比而不是概率密度?

以上是关于R Normalize 然后在 R 中一起绘制两个直方图的主要内容,如果未能解决你的问题,请参考以下文章

r normalize.r

r 将两列一起绘制为单独的行ggplot

使用ggplot在R中并排绘制两个分组变量

在 R 中,如何在绘图的两个内部函数之间传递数据帧/小标题,然后保存绘图?

如何在 R 中的线性判别分析图上绘制分类边界

如何在 R 的 3D 图中从分类算法中绘制分区平面