ggplot2中每个facet的不同函数曲线

时间:2015-04-20 07:34:44

标签: r plot ggplot2

简短:如何在ggplot2中的每个方面绘制不同的用户/数据定义曲线?


长:

我想基于分面变量将实际数据的分面散点图与用户定义的预测数据曲线叠加,即使用每个分面的不同曲线。

这是一个玩具示例:

我们有两个地点的红色或白色女王玩耍两年的刺猬数量数据,有两种不同的速率治疗方法。我们预计这些治疗方法会以每年0.5或1.5的指数速率改变刺猬种群。所以数据看起来像

queen <- as.factor(c(rep("red", 8), rep("white",8)))
site <- as.factor(c(rep(c(rep(1,4), rep(2,4)),2)))
year <- c(rep(c(rep(1,2), rep(2,2)),4))
rate <- rep(c(0.5,1.5),8)
hedgehogs <- c(8,10,6,14,16,9,8,11,11,9,9,10,8,11,11,6)    
toy.data <- data.frame(queen, site, year, rate, hedgehogs)

使用以下内容按比率制作网站的四个不错方面:

library("ggplot2")
ggplot(toy.data, aes(year, hedgehogs)) +
  geom_point(aes(colour=queen), size=10) +
  scale_colour_manual(values=c("red", "white")) +
  facet_grid(rate ~ site, labeller= label_both)

enter image description here

我想将速率曲线叠加到这些图上。

我们的预测曲线如下:

predict.hedgehogs <- function(year, rate){
  10*(rate^(year-1))
}

根据速率和年数的取幂乘以起始数(此处为10只刺猬)预测刺猬的数量。

我已尝试用stat_function进行各种填充,并在正确的轨道上制作了一些内容但不在那里,

E.g:

根据geom_hlinesee bottom page here

添加构面特定数据
facet.data <- data.frame(rate=c(0.5, 0.5, 1.5, 1.5),
                         site=c(1, 2, 1, 2))

然后绘图

ggplot(toy.data, aes(year, hedgehogs)) +
  geom_point(aes(colour = queen), size = 10) +
  scale_colour_manual(values = c("red", "white")) +
  facet_grid(rate ~ site, labeller = label_both) +
  stat_function(mapping = aes(x = year, y = predict.hedgehogs(year,rate)),
                fun = predict.hedgehogs,
                args = list(r = facet.data$rate), geom = "line")

enter image description here

或针对每种费率单独stat_function来电(即this strategy):

ggplot(toy.data, aes(year, hedgehogs)) +
  geom_point(aes(colour=queen), size=10) +
  scale_colour_manual(values=c("red", "white")) +
  facet_grid(rate ~ site, labeller= label_both) +
  stat_function(fun=predict.hedgehogs, args=list(rate=0.5), geom="line", rate==0.5)+
  stat_function(fun=predict.hedgehogs, args=list(rate=1.5), geom="line", rate==1.5)
Error: `mapping` must be created by `aes()`

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

非常感谢@Roland的评论

如果我们从上面的toy.data函数添加predict.hedgehogs预测数据:

pred.hogs <- predict.hedgehogs(year, rate)
toy.data <- data.frame(toy.data, pred.hogs)

我们可以绘制:

ggplot(toy.data, aes(year, hedgehogs)) +
  geom_point(aes(colour=queen), size=10) +
  scale_colour_manual(values=c("red", "white")) +
  facet_grid(rate ~ site) +
  geom_smooth(aes(x=year, y=pred.hogs), stat="identity", colour = "black")

enter image description here