结合两个ggplots与相同的X矢量差的做法/风格?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合两个ggplots与相同的X矢量差的做法/风格?相关的知识,希望对你有一定的参考价值。

编辑注意:我原来的最小工作示例没有准确反映我的问题。发布了两个很好的参考答案,但被我的例子误导了。有关更多信息,请参阅我对r2evan的回答的评论。我已经编辑了这个例子。谢谢!


我最近发现自己处于一个我想合并两个ggplot对象的位置。 plot1plot2具有相同的x值,我只想从y获取plot2值并将它们扔到plot1的骨干上。

它非常简单,所以我假设它已经存在,但我找不到任何东西。考虑到R的发展程度如何,我认为(1)这确实存在,我只是没有找到它,或者(2)我正在做的是糟糕的练习/风格。你能让我知道它是哪一个,如果是后者,我为什么要避免这样做?

(实际情况:我在包中有一个方法,它返回一个格式很好的ggplot对象。我想用一堆不同的对象运行该方法,但是将输出组合到一个图上。我会用这个辅助函数来累积所有将情节分成一个)


最小的工作示例

好吧,我想,不再是一个完全正常的例子了。假设已定义“mysteryObject”类,并且plotMystery方法对这些对象起作用,并使数据帧具有常量x值,但基于id字段的y值不同。

object1 <- new("mysteryObject", id=1)
plot1 <- plotMystery(object1)
plot1

plot1

object2 <- new("mysteryObject", id=2)
plot2 <- plotMystery(object2)
plot2

plot2

combine_plots <- function(ggplot1, ggplot2, color = black) {
    return(
        ggplot1 +
            geom_line(aes(x = ggplot2$data[,1], y = ggplot2$data[,2]), color = color)  
    )
}

plot_combined <- combine_plots(plot1, plot2, color = "red")
plot_combined

plot_combined

答案

您不需要做太多,只需组合数据并提供ggplot可用于分割/分组/颜色的“源”类型字段。

例如,您的数据和组合数据:

dat1 <- data.frame(x = c(1,2,3,4,5), y = c(1,2,3,4,5))
dat2 <- data.frame(x = c(1,2,3,4,5), y = c(1,2,9,16,25))

datn <- rbind.data.frame(
  transform(dat1, source = "dat1"),
  transform(dat2, source = "dat2")
)
datn
#    x  y source
# 1  1  1   dat1
# 2  2  2   dat1
# 3  3  3   dat1
# 4  4  4   dat1
# 5  5  5   dat1
# 6  1  1   dat2
# 7  2  2   dat2
# 8  3  9   dat2
# 9  4 16   dat2
# 10 5 25   dat2

情节,没有需要的grob组合:

ggplot(data = datn, aes(x = x, y = y, color = source)) +
  geom_line()

sample grouped data

有许多方法可以进一步控制它,包括(1)定义哪些颜色可用于组/颜色/方面等; (2)传说的存在和美学; (3)几乎任何其他东西(因为它是ggplot2)。

另一答案

合并数据,然后转到长格式,这可以使用tidyverse完成:

library(tidyverse)
data <- data.frame(x = c(1,2,3,4,5), y = c(1,2,3,4,5))
data2 <- data.frame(x = c(1,2,3,4,5), y = c(1,2,9,16,25))
data %>% 
full_join(data2, by = "x") %>% 
gather(key, value, -x) %>% 
ggplot(aes(x = x, y = value, group = key, color = key)) + 
geom_line()

以上是关于结合两个ggplots与相同的X矢量差的做法/风格?的主要内容,如果未能解决你的问题,请参考以下文章

在ggplot2中绘制两个具有相同y变量但不同x变量的箱线图

将多个ggplot动画组合在一起?

BZOJ4373: 算术天才⑨与等差数列

ggplot2用于带有两个相同刻度标签的条形图

POJ_1703 Find them, Catch them 并查集

如何栅格化ggplot的单层?