动态创建ggplot图例的表达式?

时间:2015-06-13 11:45:22

标签: r ggplot2 expression legend

我想绘制一条线图,多条线根据分组变量着色。现在我想通过scale - 命令:

设置图例标签
scale_color_manual(values = colors_values, labels = ...)

图例标签如下:" x ^ 2"," x ^ 3"," x ^ 4"等,动态创建范围。我现在想动态地创建表达式作为标签文本,即

  • "x^2"应该变成x 2
  • "x^3"应该变成x 3

图例标签的数量各不相同,因此我考虑了类似as.expression(sprintf("x^%i", number))的内容,这当然不适用于label函数的scale参数。

我搜索了谷歌和堆栈溢出,然而,我还没有找到一个有效的解决方案,所以我希望有人可以帮助我。

这是一个可重复的例子:

poly.term <- runif(100, 1, 60)
resp <- rnorm(100, 40, 5)
poly.degree <- 2:4
geom.colors <- scales::brewer_pal(palette = "Set1")(length(poly.degree))
plot.df <- data.frame()
for (i in poly.degree) {
  mydat <- na.omit(data.frame(x = poly.term, y = resp))
  fit <- lm(mydat$y ~ poly(mydat$x, i, raw = TRUE))
  plot.df <- rbind(plot.df, cbind(mydat, predict(fit), sprintf("x^%i", i)))
}
colnames(plot.df) <- c("x","y", "pred", "grp")
ggplot(plot.df, aes(x, y, colour = grp)) +
  stat_smooth(method = "loess", se = F) +
  geom_line(aes(y = pred))
  scale_color_manual(values = geom.colors
                     # here I want to change legend labels
                     # lables = expresion???
                     )

enter image description here

我希望图例标签为x 2 ,x 3 和x 4

1 个答案:

答案 0 :(得分:3)

ggplot(plot.df, aes(x, y, colour = grp)) +
  stat_smooth(method = "loess", se = F) +
  geom_line(aes(y = pred)) +
  scale_color_manual(values = setNames(geom.colors,
                                       paste0("x^",poly.degree)),
                     labels = setNames(lapply(poly.degree, function(i) bquote(x^.(i))), 
                                       paste0("x^",poly.degree)))

如果更改比例中的值或标签,确保正确映射非常重要。因此,您应该始终使用命名向量。

resulting plot