使用geom_segment创建时间轴可视化

时间:2017-09-25 15:44:12

标签: r ggplot2

我正在尝试使用ggplot创建一个像jFiddle中生成的图表:

NYTimes

我想我已经接近了,但我不太确定如何分离我的一些数据以便我得到正确的观点。我的数据是政治办公室持有人,看起来像这样:

name,year_elected,year_left,years_in_office,type,party
Person 1,1969,1969,1,Candidate,Unknown
Person 2,1969,1971,2,Candidate,Unknown
Person 3,1969,1973,4,Candidate,Unknown
Person 4,1969,1973,4,Candidate,Unknown
Person 5,1971,1974,3,Candidate,Unknown
Person 1,1971,1976,5,Candidate,Unknown
Person 2,1971,1980,9,Candidate,Unknown
Person 6,1973,1978,5,Candidate,Unknown
Person 7,1973,1980,7,Candidate,Unknown
Person 8,1975,1980,5,Candidate,Unknown
Person 9,1977,1978,1,Candidate,Unknown

我已经使用下面的代码非常接近这个视图了,但我认为我遇到的问题是要么错误地绘制段(例如,我似乎没有每个候选人都有一个段,或者段重叠/堆叠。我遇到的关键问题是我的办公室持有人名单大约是60,但我的图表只有大约28行。

library(googlesheets)
library(tidyverse)

# I'm reading from a Google Spreadsheet
data <- gs_title("Council Members")
data_sj <- gs_read(ss = data, ws = "Sheet1")

ggplot(data, aes(year_elected, years_in_office)) +
  geom_segment(aes(x = year_elected, y = 0, 
                   xend = year_left, yend = years_in_office)) +
  theme_minimal()

上面的代码告诉我:

Timeline visualization

提前感谢任何指针!

2 个答案:

答案 0 :(得分:0)

如果您的数据框名为d,则:

  • 将其转换为data.table
  • 将抖动添加到year_electer
  • year_left
  • 添加等效抖动
  • 添加组(作为示例)为样本着色

如果有多个点,请使用ggrepel添加文字。

代码:

library(data.table)
library(ggplot2)
library(ggrepel)

d[, year_elected2 := jitter(year_elected)]
d[, year_left2 := year_left + year_elected2 - year_elected + 0.01]
d[, group := TRUE]
d[factor(years_in_office %/% 9) == 1, group := FALSE]

ggplot(d, aes(year_elected2, years_in_office)) +
    geom_segment(aes(x = year_elected2, xend = year_left2,
                     y = 0, yend = years_in_office, linetype = group),
                 alpha = 0.8, size = 1, color = "grey") +
    geom_point(aes(year_left2), color = "black", size = 3.3) +
    geom_point(aes(year_left2, color = group), size = 2.3) +
    geom_text_repel(aes(year_left2, label = name), ) +
    scale_colour_brewer(guide = FALSE, palette = "Dark2") +
    scale_linetype_manual(guide = FALSE, values = c(2, 1)) +
    labs(x = "Year elected",
         y = "Years on office") +
    theme_minimal(base_size = 10)

结果:

enter image description here

答案 1 :(得分:0)

为了记录并解决我对上述@PoGibas答案的评论,这是我的tidyverse版本:

data_transform <- data_sj %>% 
  mutate(year_elected_jitter = jitter(year_elected)) %>% 
  mutate(year_left_jitter = year_left + year_elected_jitter - year_elected + 0.01)

ggplot(data_transform, aes(year_elected, years_in_office, label = name)) +
  geom_segment(aes(x = year_elected_jitter, y = 0, xend = year_left_jitter, yend = years_in_office, color = gender), size = 0.3) +
  geom_text_repel(aes(year_left_jitter, label = name)) +
  theme_minimal()