使用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"))
如何将stat_ecdf
缩放到第二个y轴?
答案 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()
因为你在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()