重新排序无法在ggplot中使用我当前的数据帧

时间:2018-06-29 21:53:33

标签: r ggplot2

我目前正尝试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的输出(我并不担心美观,但我知道它看起来很糟糕!): This is the output from ggplot (I'm not worried about aesthetics yet I know it looks terrible!):

此图的目标是从开始日期起按时间顺序排列法官,因此,开始日期最早的法官应该在底部,而最新日期最近的法官应该在顶部。如您所见,有多个实例违反了此规则。

它不是按时间顺序排序,而是简单地将法官按其在数据框中出现的顺序列出,这也是Wikipedia的顺序。 因此,另一段上方的线段应始终比其下方的线段更开始

我对重新排序的理解是,它将以geom_segment开头的X =进行排序,并按该顺序列出名称。

我可以找到的唯一解决此问题的方法是分解日期,然后以这种方式排序,但是我得到了错误

  

错误:输入无效:date_trans仅适用于Date类的对象。

谢谢您的帮助!

2 个答案:

答案 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创建。