【问题标题】:Changing the dataset of a ggplot object更改 ggplot 对象的数据集
【发布时间】:2015-03-30 01:13:06
【问题描述】:

我正在用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 相同的结果。

非常感谢, 娟

【问题讨论】:

  • 我错过了什么吗?如果您将 df 200)?那么无需触摸您经过大量调整的 ggplot 代码.
  • 确实,我不必再次调整代码,但我必须重新运行所有 ggplot 命令。如果我想在同一个脚本中绘制两个图,我必须再次复制并粘贴所有代码(我的目标是使用source 运行所有代码)。原则上这并没有那么糟糕,但我的剧本发展得很快,变成了一个小怪物。一种解决方案是为绘图创建一个函数,但随后我将为每个绘图创建一个函数,这似乎也很麻烦。所以,在那里,我希望隐藏在ggplot 的深处会有一个函数来做我想做的事情......
  • 啊,所以你想在 ggplot 调用中加入一点 for 循环!像 ggplot(data = for(i in two-or-more datasets), aes(.... 并让 ggplot 在同一代码上运行两个数据集。当然,超出了我的卑微能力,但 R 的向导可能有一个答案!

标签: r graphics plot ggplot2


【解决方案1】:

我认为使用 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)

【讨论】:

  • 你能用你自己的话解释一下'%+%'操作符到底是做什么的吗?
【解决方案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)

【讨论】:

    【解决方案3】:

    如果问题被重新表述为“我怎样才能避免编写重复的代码来用不同的数据制作类似的图?”,一个答案是使用适用于 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)))
    

    【讨论】:

    • 这项技术非常基础,对 ggplot 不友好。此外,使用%&gt;% 可以更轻松地重写,而无需重写变量。
    猜你喜欢
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多