我目前正尝试make my own graphical timeline like the one at the bottom of this page.使用rvest软件包从该链接中抓取表格并将其清理。
这是我的代码:
library(tidyverse)
library(rvest)
library(ggthemes)
library(lubridate)
URL <- "https://en.wikipedia.org/wiki/List_of_Justices_of_the_Supreme_Court_of_the_United_States"
justices <- URL %>%
read_html %>%
html_node("table.wikitable") %>%
html_table(fill = TRUE) %>%
data.frame()
# Removes weird row at bottom of the table
n <- nrow(justices)
justices <- justices[1:(n - 1), ]
# Separating the information I want
justices <- justices %>%
separate(Justice.2, into = c("name","year"), sep = "\\(") %>%
separate(Tenure, into = c("start", "end"), sep = "\n–") %>%
separate(end, into = c("end", "reason"), sep = "\\(") %>%
select(name, start, end)
# Removes wikipedia tags in start column
justices$start <- gsub('\\[e\\]$|\\[m\\]|\\[j\\]$$','', justices$start)
justices$start <- mdy(justices$start)
# This will replace incumbencies with NA
justices$end <- mdy(justices$end)
# Incumbent judges are still around!
justices[is.na(justices)] <- today()
justices$start = as.Date(justices$start, format = "%m/%d%/Y")
justices$end = as.Date(justices$end, format = "%m/%d%/Y")
justices %>%
ggplot(aes(reorder(x = name, X = start))) +
geom_segment(aes(xend = name,
yend = start,
y = end)) +
coord_flip() +
scale_y_date(date_breaks = "20 years", date_labels = "%Y") +
theme(axis.title = element_blank()) +
theme_fivethirtyeight() +
NULL
这是ggplot的输出(我并不担心美观,但我知道它看起来很糟糕!):
此图的目标是从开始日期起按时间顺序排列法官,因此,开始日期最早的法官应该在底部,而最新日期最近的法官应该在顶部。如您所见,有多个实例违反了此规则。
它不是按时间顺序排序,而是简单地将法官按其在数据框中出现的顺序列出,这也是Wikipedia的顺序。 因此,另一段上方的线段应始终比其下方的线段更开始
我对重新排序的理解是,它将以geom_segment开头的X =进行排序,并按该顺序列出名称。
我可以找到的唯一解决此问题的方法是分解日期,然后以这种方式排序,但是我得到了错误
错误:输入无效:date_trans仅适用于Date类的对象。
谢谢您的帮助!
答案 0 :(得分:1)
我会发表评论,但我不适合。
这是我放弃的尝试。看起来确实确实可以解决该问题,但是它破坏了格式的其他几个方面,我已经没有时间来解决它了。
justices <- justices[order(justices$start, decreasing = TRUE),]
any(diff(justices$start) > 0) # FALSE, i.e. it works
justices$id <- nrow(justices):1
ggplot(data=justices, mapping=aes(x = start, y=id)) + #,color=name, color =
scale_x_date(date_breaks = "20 years", date_labels = "%Y") +
scale_y_discrete(breaks=justices$id, labels = justices$name) +
geom_segment(aes(xend = end, y = justices$id, yend = justices$id), size = 5) +
theme(axis.title = element_blank()) +
theme_fivethirtyeight()
也请参考this线程。 GL!
答案 1 :(得分:1)
您可以使name
列成为一个因素,并使用forcats::fct_reorder
根据开始日期对名称重新排序。 fct_reorder
可以接受用于订购start
的函数;您可以使用min()
在每个大法官的最早开始日期之前订购。这样,具有多个开始日期的法官将按照最早的日期进行排序。仅有两行更改:在管道的开头添加mutate
,并在reorder
内删除aes
。
justices %>%
mutate(name = as.factor(name) %>% fct_reorder(start, min)) %>%
ggplot(aes(x = name)) +
geom_segment(aes(xend = name,
yend = start,
y = end)) +
coord_flip() +
scale_y_date(date_breaks = "20 years", date_labels = "%Y") +
theme(axis.title = element_blank()) +
theme_fivethirtyeight()
由reprex package(v0.2.0)于2018-06-29创建。