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

时间:2012-08-01 20:11:57

标签: r plot ggplot2 histogram

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

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

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

name    value
A   0.0000354
B   0.00768
C   0.00309
D   0.000123

我失败的尝试之一:

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

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

try

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

try

但我希望第一个栏的高度为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)

感谢您的帮助。

5 个答案:

答案 0 :(得分:58)

请注意,..ncount..重新调整为最多1.0,而..count..是非缩放的bin计数。

ggplot(mydataframe, aes(x=value)) +
  geom_histogram(aes(y=..count../sum(..count..)))

给出了:

enter image description here

答案 1 :(得分:13)

从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())

答案 2 :(得分:8)

从最新和最好的ggplot2版本3.0.0开始,格式已更改。现在,您可以将stat()的值包装在..中,而不用弄乱ggplot(mydataframe, aes(x = value)) + geom_histogram(aes(y = stat(count / sum(count)))) 的东西。

FeatureHasher.transform()

答案 3 :(得分:0)

我只想缩放轴,将y轴除以1000,所以我做了:

ggplot(mydataframe, aes(x=value)) +
  geom_histogram(aes(y=..count../1000))

答案 4 :(得分:0)

总结以上答案:

library(tidyverse)

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

ggplot(mydataframe, aes(x = value)) +
  geom_histogram(aes(y = stat(count / sum(count)))) +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(x="", y="")

enter image description here