【发布时间】:2020-02-16 17:26:28
【问题描述】:
假设我有这样一个函数:
library(tidyverse)
#autoplotter
scatterplot = function(data, x, y, z) {
ggplot(data, aes(!!as.symbol(x), !!as.symbol(y), color = !!as.symbol(z))) +
geom_point() +
scale_color_gradient2(low = "blue",
high = "red",
mid = "white",
midpoint = 0,
limit = c(-1, 1),
space = "Lab",
name = "Default label")
}
然后我们可以在一些数据上调用它:
#default
mpg %>%
mutate(z = runif(n(), min = -1, max = 1)) %>%
scatterplot("displ", "cyl", "z")
但是,如果我们想要另一个色标标签而不更改渐变设置怎么办?不能只使用labs():
mpg %>%
mutate(z = runif(n(), min = -1, max = 1)) %>%
scatterplot("displ", "cyl", "z") +
labs(color = "new label")
这不会改变任何事情,因为 labs() 显然无法覆盖函数中的 scale_color_gradient2()。
我们可以覆盖比例,但这会重置配色方案:
mpg %>%
mutate(z = runif(n(), min = -1, max = 1)) %>%
scatterplot("displ", "cyl", "z") +
scale_color_gradient2("new label")
我觉得这应该是可能的,要么通过指定ggplot2应该只更新label参数,要么使用ggplot2::ggplot_build()直接改变label参数,然后重建绘图。但是我在对象中找不到色标的标签值。太难搜索了,但它应该在某个地方!
【问题讨论】:
-
为什么不给
scatterplot函数添加一个额外的参数? -
在某些情况下,函数是包的一部分,所以改变它的定义不太实用。
-
你对我的回答投了反对票吗?为什么?
-
是的。它没有解决专门关于修改对象而不是更改功能的问题。 StupidWolf 提供了正确答案。
-
我认为这对你来说是不公平的。我的回答为您正在寻找的内容提供了一个有效的选择。在我看来,你没有把问题说得足够清楚,也可以对你的反对票发表评论,以便让我有机会改变我的答案。