使用 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)
如何缩放stat_ecdf到第二个 y 轴?
通常,您希望将内部计算的 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)