更改 ggplot 对象的数据集

Changing the dataset of a ggplot object

我正在用 ggplot2 绘制我的数据子集,我想知道我是否会以某种方式使用原始数据子集中的 ggplot 对象中已经包含的所有选项。例如,这是第一个图(代码块 1):

require(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt, color=factor(cyl))) + geom_point(shape=21, size=4)
print(p)

现在我想用 mtcars 的子集制作第二个图,所以我通常会这样做(代码块 2):

new_data <- subset(mtcars, disp > 200)
p <- ggplot(new_data, aes(mpg, wt, color=factor(cyl))) + geom_point(shape=19, size=4)
print(p)

数据集这么小的差异,把所有的代码都重新写一遍,似乎有点麻烦。通常在 ggplot 中,您可以更改一些参数(这是正确的术语吗?)使用 p 进行正确的操作;例如,我可以使用 p + scale_color_manual(values=rainbow(3)) 更改绘图颜色。当然,这只是一个愚蠢的例子,但是当我有一个非常详细的情节,到处都有很多调整时,它真的很烦人。

所以基本上,我想知道是否有某种方法,比如函数 x 这样我就可以做到这一点:

p + x(data = new_data)

并获得与代码块 2 相同的结果。

非常感谢, 胡安

如果你只想要 chunk2:

ggplot(mtcars[mtcars$disp>200,], aes(mpg, wt, color=factor(cyl)))+
geom_point(shape=19, size=4)

如果你想把它们都放在一个情节中:

ggplot() + 
geom_point(data=mtcars, aes(mpg, wt, color=factor(cyl)),shape=21, size=4)+
geom_point(data=mtcars[mtcars$disp>200,], aes(mpg, wt, color=factor(cyl)),shape=19, size=4)

我认为使用 ggplot %+% 运算符可以很容易地完成。

p <- ggplot(mtcars, aes(mpg, wt, color=factor(cyl))) + geom_point(shape=21, size=4)
print(p)

p2<-p %+% mtcars[mtcars$disp>200,]
print(p2)

如果问题重新表述为 "How can I avoid writing repeated code to make similar plots with different data?",一个答案是使用适用于 ggplot 对象的函数:

my_plot <- function (p) {
    p + aes(color=factor(cyl)) + geom_point(shape=21, size=4)
}

p1 <- ggplot(mtcars, aes(mpg, wt))
p2 <- ggplot(newdata, aes(mpg, wt))

p1 <- my_plot(p1); print(p1)
p2 <- my_plot(p2); print(p2)

这将所有共享绘图参数填充到一个地方,使代码更清晰,易于维护。当然,代码仍然针对每个绘图对象运行。

你当然可以通过组合函数来任意地使事情复杂化(我自己工作中最近的一个例子):

p2 <- by_gene(stacked_bars(my_plot(p2)))