代码之家  ›  专栏  ›  技术社区  ›  Y.Coch

R中的ggplo2:geom\U段显示的线与geom\U线不同

  •  2
  • Y.Coch  · 技术社区  · 7 年前

    假设我有这个数据框:

    treatment <- c(rep("A",6),rep("B",6),rep("C",6),rep("D",6),rep("E",6),rep("F",6))
    year <- as.numeric(c(1999:2004,1999:2004,2005:2010,2005:2010,2005:2010,2005:2010))
    variable <- c(runif(6,4,5),runif(6,5,6),runif(6,3,4),runif(6,4,5),runif(6,5,6),runif(6,6,7))
    se <- c(runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5),runif(6,0.2,0.5))
    id <- 1:36
    df1 <- as.data.table(cbind(id,treatment,year,variable,se))
    
    df1$year <- as.numeric(df1$year)
    df1$variable <- as.numeric(df1$variable)
    df1$se <- as.numeric(df1$se)
    

    draw two lines with the same origin using ggplot2 in R

    我使用以下脚本成功地做到了这一点:

    y1 <- df1[df1$treatment=='A'&df1$year==2004,]$variable
    y2 <- df1[df1$treatment=='B'&df1$year==2004,]$variable
    y3 <- df1[df1$treatment=='C'&df1$year==2005,]$variable
    y4 <- df1[df1$treatment=='D'&df1$year==2005,]$variable
    y5 <- df1[df1$treatment=='E'&df1$year==2005,]$variable
    y5 <- df1[df1$treatment=='E'&df1$year==2005,]$variable
    y6 <- df1[df1$treatment=='F'&df1$year==2005,]$variable
    
    p <- ggplot(df1,aes(x=year,y=variable,group=treatment,color=treatment))+
    geom_line(aes(y = variable, group = treatment, linetype = treatment, color = treatment),size=1.5,lineend = "round") +
    scale_linetype_manual(values=c('solid','solid','solid','dashed','solid','dashed')) +
    geom_point(aes(colour=factor(treatment)),size=4)+
    geom_errorbar(aes(ymin=variable-se,ymax=variable+se),width=0.2,size=1.5)+
    guides(colour = guide_legend(override.aes = list(shape=NA,linetype = c("solid", "solid",'solid','dashed','solid','dashed'))))
    
    p+labs(title="Title", x="years", y = "Variable 1")+
      theme_classic() +
    scale_x_continuous(breaks=c(1998:2010), labels=c(1998:2010),limits=c(1998.5,2010.5))+
      geom_segment(aes(x=2004, y=y1, xend=2005, yend=y3),colour='blue1',size=1.5,linetype='solid')+
      geom_segment(aes(x=2004, y=y1, xend=2005, yend=y4),colour='blue1',size=1.5,linetype='dashed')+
      geom_segment(aes(x=2004, y=y2, xend=2005, yend=y5),colour='red3',size=1.5,linetype='solid')+
      geom_segment(aes(x=2004, y=y2, xend=2005, yend=y6),colour='red3',size=1.5,linetype='dashed')+
      scale_color_manual(values=c('blue1','red3','blue1','blue1','red3','red3'))+
      theme(text = element_text(size=12))
    

    figure

    size=1.5 linetype='solid' dashed ).

    当然,我可以手动更改线段的大小以获得类似的线,但当我这样做时,线段不如使用 geom_line . 此外,通过包含 size linetype aes()

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dave Gruenewald    7 年前

    这似乎是geom_段的抗混叠问题,但从一开始,这似乎是一种有点麻烦的方法。我想我通过复制 A B 原始数据帧中的处理。

    # First we are going to duplicate and rename the 'shared' treatments
    library(dplyr)
    library(ggplot2)
    
    df1 %>% 
      filter(treatment %in% c("A", "B")) %>% 
      mutate(treatment = ifelse(treatment == "A",
                                "AA", "BB")) %>% 
      bind_rows(df1) %>% # This rejoins with the original data
      # Now we create `treatment_group` and `line_type` variables
      mutate(treatment_group = ifelse(treatment %in% c("A", "C", "D", "AA"),
                                      "treatment1",
                                      "treatment2"), # This variable will denote color
             line_type = ifelse(treatment %in% c("AA", "BB", "D", "F"),
                                "type1",
                                "type2")) %>% # And this variable denotes the line type
    
    # Now pipe into ggplot
      ggplot(aes(x = year, y = variable,
                 group = interaction(treatment_group, line_type), # grouping by both linetype and color
                 color = treatment_group)) +
      geom_line(aes(x = year, y = variable, linetype = line_type), 
                size = 1.5, lineend = "round") +
      geom_point(size=4) +
      # The rest here is more or less the same as what you had
      geom_errorbar(aes(ymin = variable-se, ymax = variable+se), 
                    width = 0.2, size = 1.5) +
      scale_color_manual(values=c('blue1','red3')) +
      scale_linetype_manual(values = c('dashed', 'solid')) +
      labs(title = "Title", x = "Years", y = "Variable 1") +
      scale_x_continuous(breaks = c(1998:2010), 
                         limits = c(1998.5, 2010.5))+
      theme_classic() +
      theme(text = element_text(size=12))
    

    enter image description here

    我的数字不同,因为它们是随机生成的。

    然后,您可以根据自己的喜好修改图例,但我的建议是使用以下内容 geom_label check_overlap = TRUE

    希望这有帮助!