将R ggplot中的直方图中的y轴归一化为比例

Fir*_*ast 46 plot r histogram ggplot2

我有一个非常简单的问题,让我把头撞在墙上.

我想缩放直方图的y轴以反映每个bin组成的比例(0到1),而不是将条的面积总和为1,因为使用y = .. density ...或者最高的条形为1,因为y = .. ncount ..的确如此.

我的输入是名称和值的列表,格式如下:

name    value
A   0.0000354
B   0.00768
C   0.00309
D   0.000123
Run Code Online (Sandbox Code Playgroud)

我失败的尝试之一:

library(ggplot2)
mydataframe < read.delim(mydata)
ggplot(mydataframe, aes(x = value)) +
geom_histogram(aes(x=value,y=..density..))
Run Code Online (Sandbox Code Playgroud)

这给了我一个区域为1的直方图,但是高度为2000和1000:

尝试

和y = .. ncount ..给我一个最高条1.0的直方图,其余的缩放到它:

尝试

但我希望第一个条的高度为0.5,另外两个为0.25.

R也不承认scale_y_continuous的这些用法.

scale_y_continuous(formatter="percent")
scale_y_continuous(labels = percent)
scale_y_continuous(expand=c(1/(nrow(mydataframe)-1),0)
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助.

And*_*ndy 64

请注意,..ncount..重新..count..缩放到最大值为1.0,而非缩放的bin计数.

ggplot(mydataframe, aes(x=value)) +
  geom_histogram(aes(y=..count../sum(..count..)))
Run Code Online (Sandbox Code Playgroud)

这使:

在此输入图像描述

  • 我不知道有可能做这样的事情.由于这个技巧,我能够通过使用`aes(y = 1-cumsum(.. count ..)/ sum(.. count ..))来产生生存/可靠性(即1-CDF)直方图. (8认同)

aar*_*len 16

从ggplot2 0.9开始,许多格式化程序函数都已移至scale包,包括percent_format().

library(ggplot2)
library(scales)

mydataframe <- data.frame(name = c("A", "B", "C", "D"),
                          value = c(0.0000354, 0.00768, 0.00309, 0.000123))

ggplot(mydataframe) + 
  geom_histogram(aes(x = value, y = ..ncount..)) +
  scale_y_continuous(labels = percent_format())
Run Code Online (Sandbox Code Playgroud)


Cep*_*irk 15

截至最新最好的ggplot2版本3.0.0,格式已发生变化.现在你可以包装y价值stat()而不是搞乱..东西.

ggplot(mydataframe, aes(x = value)) +
  geom_histogram(aes(y = stat(count / sum(count))))
Run Code Online (Sandbox Code Playgroud)

  • @CephBirkSuppose 我还为美观指定了“fill=column”。`count/sum(count)` 是按总数标准化,还是按每个填充组中的数量标准化? (2认同)