如何使用ggplot2限制stat_function图的范围?

时间:2014-06-18 01:51:39

标签: r ggplot2

我正在尝试使用以下代码创建一个数字来显示不同的饱和度水平及其对采样动态的影响:

max <- 2
decay <- function(x, k, C) {
    C * (1 - exp(-k*x))
}
require("ggplot2")
ggplot(NULL, aes(x=x, colour = C)) +
    stat_function(data = data.frame(x = 0:max, C = factor(1)), fun = function(x) { decay(x, k=10, C=1e1) }) +
    stat_function(data = data.frame(x = 0:max, C = factor(2)), fun = function(x) { decay(x, k=10, C=1e2) }) +
    stat_function(data = data.frame(x = 0:max, C = factor(3)), fun = function(x) { decay(x, k=10, C=1e3) }) +
    stat_function(data = data.frame(x = 0:max, C = factor(4)), fun = function(x) { decay(x, k=10, C=1e4) }) +
    stat_function(data = data.frame(x = 0:max, C = factor(5)), fun = function(x) { decay(x, k=10, C=1e5) }) +
    stat_function(data = data.frame(x = 0:max, C = factor(6)), fun = function(x) { decay(x, k=10, C=1e6) }) +
    scale_colour_manual(values = c("red", "orange", "yellow", "green", "blue", "violet"), labels = c(1, 2, 3, 4, 5, 6)) + scale_colour_discrete(name=expression(paste(C, " value"))) + 
    ylab(label="count") + ylim(0, 100)

目的是表明对于高C值情况,曲线将呈现线性。但是,当我希望它只是将曲线截断为最大值时,ylim可以防止显示任何曲线,其值大于ylim的最大值。

如何获得所需的行为?

1 个答案:

答案 0 :(得分:5)

您已注意到限制scale(使用scale_y_continuous(limits=...))之间的区别 或限制坐标空间(使用coord_cartesian(ylim=...)

当您致电ylim时,它会使用等效的scale_y_continuous并删除不在范围内的观察值

ylimxlim的帮助描述了这一点(并指向coord_cartesian作为替代方案)

# here is your example rewritten
ggplot(data = NULL, aes(x=x,colour=C))  +
  lapply(1:6, function(y){
        stat_function(data = data.frame(x=0:max,C=factor(y)), 
            fun = function(x) decay(x,k=10, C = 10^y))) + 
scale_colour_manual(values = c("red", "orange", "yellow", "green", "blue", "violet"), 
                    labels = c(1, 2, 3, 4, 5, 6)) +   
scale_colour_discrete(name=expression(paste(C, " value"))) + 
ylab(label="count") +
coord_cartesian(ylim = c(0,100))