我用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相同的内容。
非常感谢, 涓
答案 0 :(得分:16)
我认为可以使用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)
答案 1 :(得分: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)
答案 2 :(得分:2)
如果问题被重新表述为,&#34;我如何避免编写重复的代码来制作具有不同数据的类似图?&#34;,一个答案是使用适用于ggplot对象的函数:< / p>
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)))