代码之家  ›  专栏  ›  技术社区  ›  John Doe

如何创建按顺序使用数据帧中数据的分段绘图?

  •  0
  • John Doe  · 技术社区  · 6 年前

    我有一个如下所示的数据框:

    > print(df)
      person step start end
    1    sam    A     0   4
    2    sam    B     4   6
    3   greg    A     2   7
    4   greg    B     7  11
    

    我创造了以下情节:

    ggplot(df, aes(colour=step)) + 
     geom_segment(aes(x=start, xend=end, y=person, yend=person), size=3) +
      xlab("Duration")
    

    Segmented Plot

    这看起来和我想要的一模一样。但是,我的输入数据结构已更改为:

     step       sam    greg
    1    A        0       2
    2    B        4       7
    3    C        6      11
    

    这个结构的意思基本上是一样的,但我不知道怎样才能轻易地把它转换成 geom_segment 了解它现在是按列而不是按行排列的。我需要将它转换回旧的数据结构(包括开始和结束)还是可以通过某种方式解决?

    1 回复  |  直到 6 年前
        1
  •  2
  •   www    6 年前

    它实际上不是 ggplot2 问题,但是一个数据争用问题,目标是基于第二个数据帧创建第一个数据帧。这里有一个选项 dplyr tidyr .

    library(dplyr)
    library(tidyr)
    
    dat2 <- dat %>%
      gather(person, Value, -step) %>%
      group_by(person) %>%
      slice(rep(row_number(), each = 2)) %>%
      slice(2:(n() - 1)) %>%
      mutate(Type = rep(c( "start", "end"), times = n()/2),
             step = rep(LETTERS[1:(n()/2)], each = 2)) %>%
      spread(Type, Value) %>%
      arrange(person, step) %>%
      select(step, person, start, end) %>%
      arrange(desc(person), step) %>%
      ungroup()
    dat2
    # # A tibble: 4 x 4
    #   step  person start   end
    #   <chr> <chr>  <int> <int>
    # 1 A     sam        0     4
    # 2 B     sam        4     6
    # 3 A     greg       2     7
    # 4 B     greg       7    11
    

    数据

    dat <- read.table(text = " step       sam    greg
    1    A        0       2
                      2    B        4       7
                      3    C        6      11",
                      header = TRUE, stringsAsFactors = FALSE)