通过将ggplot()对象分配给变量,可以轻松地重复使用该对象,并使用geom图层上的变体创建多个版本的绘图,而不会为每个绘图添加冗余代码。但是,我想知道是否有一种方法可以在交换全局美学映射时重用geom层。
一个用例就是我想制作几个具有相同几何表示的图,但是想要换出映射到其中一个维的变量。另一个用例是我想制作两个图,其中数据来自两个不同的数据帧。
直观的解决方法是1)将geom图层组合保存到变量而不指定ggplot()对象或2)覆盖变量中现有ggplot()对象的数据和美观通过添加另一个ggplot()对象。执行这些操作中的任何一个都会导致错误(对于1-和#34;二元运算符的非数字参数,对于2 - "不知道如何将o添加到情节")。 / p>
例如,假设在下面的图中我想重新使用gg变量,但是将x变量重新映射到数据帧中的其他内容:
dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
gg <-
(ggplot(data = dsamp, aes(x = carat, y = price, color = clarity))
+ geom_point()
+ facet_wrap(~ cut))
print(gg)
在实践中,绘图定义可能超过3行,这就是为什么这开始是代码维护烦恼。
答案 0 :(得分:18)
与美学相关的交换变量和与绘图相关的数据都很简单。使用您在问题中定义的gg
,单独使用aes
来改变美感:
gg + aes(x=table, y=depth)
要更改用于绘图的数据,请使用%+%
运算符。
dsamp2 <- head(diamonds, 100)
gg %+% dsamp2
答案 1 :(得分:3)
就像朱兰提到的那样,我猜...但是:
你可以做两件事之一,编辑ggplot2对象(坏主意)或将图包装在一个函数中。
让我们使用以下数据并绘制调用:
dat <- data.frame(x=1:10, y=10:1, z=1, a=letters[1:2], b=letters[3:4])
# p <- ggplot(dat, aes_string(x=xvar, y=yvar, color=colorvar)) + geom_point()
注意我使用了aes_string
所以我可以传递变量而不是列名。
xvar <- 'y'
yvar <- 'z'
colorvar <- 'a'
p <- ggplot(dat, aes_string(x=xvar, y=yvar, color=colorvar)) + geom_point()
p
的结构如下,我将留给您整理编辑它。相反,将ggplot包装在一个函数中:
plotfun <- function(DF, xvar, yvar, colorvar) {
ggplot(DF, aes_string(x=xvar, y=yvar, color=colorvar)) + geom_point()
}
p <- plotfun(dat, 'z', 'x', 'a')
p
str(p)
List of 8
$ data :'data.frame': 10 obs. of 5 variables:
..$ x: int [1:10] 1 2 3 4 5 6 7 8 9 10
..$ y: int [1:10] 10 9 8 7 6 5 4 3 2 1
..$ z: num [1:10] 1 1 1 1 1 1 1 1 1 1
..$ a: chr [1:10] "a" "b" "a" "b" ...
..$ b: chr [1:10] "c" "d" "c" "d" ...
$ layers :List of 1
..$ :Classes 'proto', 'environment' <environment: 0x34d5628>
$ scales :Reference class 'Scales' [package "ggplot2"] with 1 fields
..$ scales: list()
..and 20 methods, of which 9 are possibly relevant:
.. add, clone, find, get_scales, has_scale, initialize, input, n, non_position_scales
$ mapping :List of 3
..$ x : symbol y
..$ y : symbol x
..$ colour: symbol a
$ options :List of 1
..$ labels:List of 3
.. ..$ x : chr "z"
.. ..$ y : chr "x"
.. ..$ colour: chr "a"
$ coordinates:List of 1
..$ limits:List of 2
.. ..$ x: NULL
.. ..$ y: NULL
..- attr(*, "class")= chr [1:2] "cartesian" "coord"
$ facet :List of 1
..$ shrink: logi TRUE
..- attr(*, "class")= chr [1:2] "null" "facet"
$ plot_env :<environment: R_GlobalEnv>
- attr(*, "class")= chr "ggplot"