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

时间:2018-06-13 23:07:39

标签: r ggplot2

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

> 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 个答案:

答案 0 :(得分:2)

这实际上不是ggplot2问题,而是一个数据争论问题,目标是根据您的第二个数据框创建您的第一个数据框。以下是dplyrtidyr的选项。

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)