2017-09-25 60 views
1

我想創建這樣一個在NYTimes產生:使用ggplot圖表:使用geom_segment創建時間表可視化

Timeline visualization

我覺得我越來越近,但我不是很確定如何分離出我的一些數據,以便得到正確的視圖。我的數據是出現這樣的政治職位的人:

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 chart

感謝提前任何指針!

+0

兩處理重疊的方法。 1)使用實際的選舉和離開日期,而不是分箱到整數年份。 2)使用帶終點標記的半透明線條顯示每個人。對於垂直線段,使用與1)相同的技術,以便當某人在同一年進入和離開辦公室時,他們仍然有兩個不同的x值。 – Brian

+0

@JasonHeppler你有確切的日期(不是四捨五入到一年)? – PoGibas

+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

感謝您的建議!這似乎已經成功了。我使用mutate來代替子集化(但是達到同樣的效果),我對它進行了輕微調整,使其更適合'tidyverse'友好。 –

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()