【问题标题】:How can I omit a particular section of a ggplot (geom_line) graph in R?如何在 R 中省略 ggplot (geom_line) 图的特定部分?
【发布时间】:2019-09-07 10:51:20
【问题描述】:

我目前正在尝试绘制一个实验的结果,在该实验中我比较了对照和实验治疗之间的死亡率。最好的表示是使用 geom_line 连接每个处理的平均值(时间延迟)。但是,我还想包括对照值,以便能够显示实验治疗中的死亡率何时恢复到对照中看到的相似值。我不希望 geom_line() 从控件 (w=0) 到第一个处理 (w=1) 画一条线。信息量不大。

我尝试在 geom_line() 函数中使用子集。它可以工作,但是与我不包含子集语句时相比,图形输出完全不同。

这里有一些代码应该会有所帮助。第一个脚本是向您展示正常的情节

dat <- data.frame(w = c(rep(0, 4), rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4)), TempTr = c("24.C", "28.C", "24.NC", "28.NC"), Species = "S", Wasp = "A", mort = rnorm(20, 7, 1), se=rnorm(20, 0.5, 0.1))

pd = position_dodge(0.2)

dat %>%
  ggplot(aes(y=mort, x=w, colour=TempTr, group=TempTr)) + geom_errorbar(aes(ymin=mort-se, ymax=mort+se), colour="black", width=0, position = pd) + geom_point(aes(fill=TempTr), colour = "black", size=2, alpha=0.8, shape=21, position = pd) + geom_line(aes(linetype=TempTr), position=pd, size=1.25, alpha=0.8)

现在我尝试删除 w=0 和 w=1 之间的部分。换句话说,只显示从 w=1:4 开始的行

dat %>%
  ggplot(aes(y=mort, x=w, colour=TempTr, group=TempTr)) + geom_errorbar(aes(ymin=mort-se, ymax=mort+se), colour="black", width=0, position = pd) + geom_point(aes(fill=TempTr), colour = "black", size=2, alpha=0.8, shape=21, position = pd) + geom_line(aes(linetype=TempTr), position=pd, size=1.25, alpha=0.8, data=subset(dat, w %in% c("1", "2", "3", "4")))

这可行,但不适用于我的真实数据。当我用我的真实数据(有几个物种,因此有几个方面)执行此操作时,线条不再正确连接点。省略了 0 和 1 之间的线,但情节的其余部分是错误的。知道这是为什么吗?是我放置函数的顺序吗? Normal plot from original data

Bad plot from original data after removing the desired section

这是来自原始数据的图像。

【问题讨论】:

    标签: r ggplot2 subset


    【解决方案1】:

    简而言之,您需要按SpeciesTempTr 之间的交互进行分组。

    为了重现问题,我们制作了第二个数据集,其中SpeciesR。然后按行绑定,以便我们以后可以按物种facet

    library(ggplot2)
    library(dplyr)
    
    dat <-
      data.frame(
        w = c(rep(0, 4), rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4)),
        TempTr = c("24.C", "28.C", "24.NC", "28.NC"),
        Species = "S",
        Wasp = "A",
        mort = rnorm(20, 7, 1),
        se = rnorm(20, 0.5, 0.1)
      )
    
    dat2 <- dat %>% dplyr::mutate(Species="R")
    
    dat3 <- dplyr::bind_rows(dat, dat2)
    

    然后绘制。注意geom_line中对interaction的调用:

    dat3 %>% ggplot(aes(
      y = mort,
      x = w,
      colour = TempTr,
      group = TempTr
    )) + geom_errorbar(
      aes(ymin = mort - se, ymax = mort + se),
      colour = "black",
      width = 0,
      position = pd
    ) + geom_point(
      aes(fill = TempTr),
      colour = "black",
      size = 2,
      alpha = 0.8,
      shape = 21,
      position = pd
    ) + geom_line(
      aes(linetype = TempTr, 
    # make sure the lines respect TempTr _and_ Species
      group=interaction(TempTr, Species)),
      position = pd,
      size = 1.25,
      alpha = 0.8,
      data = subset(dat3, w %in% c("1", "2", "3", "4"))
    )+
      facet_wrap("Species")
    

    应该这样做:

    编辑:由两个变量分面。 interaction in geom_line 不需要

    library(ggplot2)
    library(dplyr)
    # species S, wasp A
    datSA <-
      data.frame(
        w = c(rep(0, 4), rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4)),
        TempTr = c("24.C", "28.C", "24.NC", "28.NC"),
        Species = "S",
        Wasp = "A",
        mort = rnorm(20, 7, 1),
        se = rnorm(20, 0.5, 0.1)
      )
    
    # make other species:wasp combinations
    datRA <- datSA %>% dplyr::mutate(Species="R")
    datSB <- datSA %>% dplyr::mutate(Species="S", Wasp="B")
    datRB <- datSA %>% dplyr::mutate(Species="R", Wasp="B")
    
    # bind and make a variable for faceting
    dat3 <- dplyr::bind_rows(datSA, datSB, datRA, datRB, .id="table") %>% 
      mutate(species_by_wasp=case_when(table == 1 ~ "SA",
                                       table == 2 ~ "SB",
                                       table == 3 ~ "RA",
                                       table == 4 ~ "RB"))
    
    pd = position_dodge(0.2)
    
    dat3 %>% ggplot(aes(
      y = mort,
      x = w,
      colour = TempTr,
      group = TempTr
    )) + geom_errorbar(
      aes(ymin = mort - se, ymax = mort + se),
      colour = "black",
      width = 0,
      position = pd
    ) + geom_point(
      aes(fill = TempTr),
      colour = "black",
      size = 2,
      alpha = 0.8,
      shape = 21,
      position = pd
    ) + geom_line(
      aes(linetype = TempTr, group=TempTr),
      position = pd,
      size = 1.25,
      alpha = 0.8,
      data = subset(dat3, w %in% c("1", "2", "3", "4"))
    )+
      # facet_grid(Species ~ Wasp)
      facet_wrap("species_by_wasp")
    

    应该这样做:

    【讨论】:

    • 这看起来很有希望。感谢您的建议。但是,我试过了,我仍然得到相同的情节。正如您在我提供的数字中看到的那样,我实际上有两组方面。因此,我尝试按三个变量对该行进行分组。它仍然无法正常工作。这是我的 geom_line 代码。你在你的情节中的其他一切都和我的一样。 geom_line(aes(linetype = TempTr, group=interaction(TempTr, WaspSpecies, Combination)), position=pd, size=1.25, alpha=0.8, data = subset(mort.means, w != "0"))跨度>
    • 不知道发生了什么,因为它在我端的两个分面变量上运行良好,至少在示例数据中。请参阅我的答案中的编辑。
    • 我发现了这个问题。我正在根据数据集中的另一个因素进行过滤,而 geom_line 中代码的子集部分无法识别该初始子集。例如, dat3 %>% filter(species == "S") %>% ggplot()..... 所以我只是创建了一个单独的数据集并从该数据集中子集。工作得很好。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多