使用不同比例的累积分布曲线(ECDF)创建ggplot2直方图

时间:2018-01-10 22:54:23

标签: r ggplot2

使用ggplot2,我可以使用以下代码创建具有累积分布曲线的直方图。但是,stat_ecdf曲线会缩放到左侧y轴。

library(ggplot2)
test.data <- data.frame(values = replicate(1, sample(0:10,1000, rep=TRUE)))
g <- ggplot(test.data, aes(x=values))
g + geom_bar() + 
    stat_ecdf() + 
    scale_y_continuous(sec.axis=sec_axis(trans = ~./100, name="percentage"))

以下是生成的图表(您可以在底部看到ecdf): ggplot result

如何将stat_ecdf缩放到第二个y轴?

1 个答案:

答案 0 :(得分:4)

通常,您希望将内部计算的ECDF值(累积密度)(称为..y..)乘以轴变换的倒数,以使其垂直范围类似于柱:

library(tidyverse)
library(scales)

set.seed(2)
test.data <- data.frame(values = replicate(1, sample(0:10,1000, rep=TRUE)))

ggplot(test.data, aes(x=values)) +
  geom_bar(fill="grey70") + 
  stat_ecdf(aes(y=..y..*100)) + 
  scale_y_continuous(sec.axis=sec_axis(trans = ~./100 , name="percentage", labels=percent)) +
  theme_bw()

enter image description here

因为你在11个桶中随机分配了1,000个值,所以碰巧两个y尺度都是10的倍数。下面是一个更通用的版本。

此外,能够以编程方式确定转换因子是很好的,这样我们就不必在看到图中的条形高度后手动选择它。为此,我们计算ggplot外最高条的高度,并在图中使用该值(下面称为max_y)。我们还使用pretty函数将max_y重置为与最高柱相关联的y轴上的最高中断值(ggplot使用pretty来设置默认轴中断),以便主要和次要的y轴断裂将排成一行。

最后,我们使用aes_bquote来创建引用调用,以便ggplot识别传递的max_y值。

set.seed(2)
test.data <- data.frame(values = replicate(1, sample(0:10,768, rep=TRUE)))

max_y = max(table(test.data$values))
max_y = max(pretty(c(0,max_y)))

ggplot(test.data, aes(x=values)) +
  geom_bar(fill="grey70") + 
  stat_ecdf(aes_(y=bquote(..y.. * .(max_y)))) + 
  scale_y_continuous(sec.axis=sec_axis(trans = ~./max_y, name="percentage", labels=percent)) +
  theme_bw()

enter image description here