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

zam*_*nee 1 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"))
Run Code Online (Sandbox Code Playgroud)

这是生成的图表(您可以在底部看到 ecdf): ggplot 结果

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

eip*_*i10 5

通常,您希望将内部计算的 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

因为您在 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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明