为 ggplot 图例动态创建表达式?
Dynamically create expression for ggplot legend?
我想绘制一个折线图,有多条线,颜色取决于分组变量。现在我想通过 scale
-command:
设置图例标签
scale_color_manual(values = colors_values, labels = ...)
图例标签如下:"x^2"、"x^3"、"x^4"等,其中范围是动态创建的。我现在想动态创建表达式作为标签文本,即
"x^2"
应该变成 x2
"x^3"
应该变成 x3
等等
图例标签的数量各不相同,所以我想到了像 as.expression(sprintf("x^%i", number))
这样的东西,它当然不能作为 scale
函数的 label
参数。
我搜索了 google 和堆栈溢出,但是,我还没有找到可行的解决方案,所以我希望有人能在这里帮助我。
这是一个可重现的例子:
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???
)
我希望图例标签为 x2、x3 和 x4.
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)))
如果您更改比例尺中的值或标签,请务必确保映射正确。因此,您应该始终使用命名向量。
我想绘制一个折线图,有多条线,颜色取决于分组变量。现在我想通过 scale
-command:
scale_color_manual(values = colors_values, labels = ...)
图例标签如下:"x^2"、"x^3"、"x^4"等,其中范围是动态创建的。我现在想动态创建表达式作为标签文本,即
"x^2"
应该变成 x2"x^3"
应该变成 x3
等等
图例标签的数量各不相同,所以我想到了像 as.expression(sprintf("x^%i", number))
这样的东西,它当然不能作为 scale
函数的 label
参数。
我搜索了 google 和堆栈溢出,但是,我还没有找到可行的解决方案,所以我希望有人能在这里帮助我。
这是一个可重现的例子:
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???
)
我希望图例标签为 x2、x3 和 x4.
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)))
如果您更改比例尺中的值或标签,请务必确保映射正确。因此,您应该始终使用命名向量。