使用不同的比例尺在ggplot2中创建一个具有累积分布曲线(ECDF)的直方图

3
使用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"))

这里展示了生成的图表(可以在底部看到经验累积分布函数):ggplot result
如何将stat_ecdf缩放到第二个y轴?
1个回答

7

通常情况下,您希望将内部计算的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

因为您将1,000个值随机分布在11个桶中,所以两个y轴都是10的倍数。以下是更一般的版本。

此外,最好能够以编程方式确定转换因子,这样我们就不必在查看绘图中的条形高度后手动选择它。为此,我们在ggplot之外计算最高柱的高度,并使用该值(下面称为max_y)在图中。我们还使用pretty函数将max_y重置为与最高柱相关联的y轴上最高断点值,以便主要和次要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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接