library(stringi)
library(rvest)
library(hrbrthemes)
library(tidyverse)

article <- read_html("https://theconversation.com/the-epa-has-backed-off-enforcement-under-trump-here-are-the-numbers-108640")

html_node(article, "iframe#psm7n") %>% # find the iframe
  html_attr("src") %>% # get iframe URL
  read_html() %>%  # read it in
  html_node(xpath=".//script[contains(., 'data: ')]") %>% # find the javascript section with the data
  html_text() %>% # get that section
  stri_split_lines() %>% # split into lines so we can target the actual data element
  unlist() %>% 
  keep(stri_detect_fixed, 'data: "Fiscal') %>% # just get the data line
  stri_trim_both() %>% # prep it for extraction
  stri_replace_first_fixed('data: "', "") %>% 
  stri_replace_last_fixed('"', "") %>% 
  stri_replace_all_fixed("\\n", "\n") %>% # make lines lines
  stri_split_lines() %>% 
  unlist() %>%
  stri_split_fixed("\\t") %>% # we now have a list of vectors
  map_dfc(~set_names(list(.x[2:length(.x)]), .x[1])) %>%  # first element of each vector is colname
  type_convert(col_types = "cddn") %>% # get real types
  set_names(c("act", "y2018", "y2017", "pct")) -> psm

psm
## # A tibble: 8 x 4
##   act    y2018 y2017   pct
##   <chr>  <dbl> <dbl> <dbl>
## 1 CAA      199   405   -51
## 2 CERCLA   147   194   -24
## 3 CWA      320   565   -43
## 4 EPCRA     56   107   -48
## 5 FIFRA    363   910   -60
## 6 RCRA     149   275   -46
## 7 SDWA     121   178   -32
## 8 TSCA      80   152   -47
## # A tibble: 8 x 4
##   act    y2018 y2017   pct
##   <chr>  <dbl> <dbl> <dbl>
## 1 CAA      199   405   -51
## 2 CERCLA   147   194   -24
## 3 CWA      320   565   -43
## 4 EPCRA     56   107   -48
## 5 FIFRA    363   910   -60
## 6 RCRA     149   275   -46
## 7 SDWA     121   178   -32
## 8 TSCA      80   152   -47

psm %>%
  arrange(desc(y2017)) %>%
  mutate(act = factor(act, levels = rev(act))) -> psm

# setup x axis breaks and max value for label position computation
x_breaks <- pretty(c(psm$y2018, psm$y2017))
max_val <- max(x_breaks)

# act info for caption
c(
  "CAA" = "Clean Air Act (CAA)",
  "CWA" = "Clean Water Act (CWA)",
  "EPCRA" = "Emergency Planning and Community Right to Know Act (EPCRA)",
  "FIFRA" = "Federal Insecticide, Fungicide, and Rodenticide Act (FIFRA)",
  "RCRA" = "Resource Conservation and Recovery Act (RCRA)",
  "SDWA" = "Safe Drinking Water Act (SDWA)",
  "TSCA" = "Toxic Substances Control Act (TSCA)",
  "CERCLA" = "Comprehensive Environmental Response, Compensation, and Liability Act (CERCLA)"
) -> acts

w125 <- scales::wrap_format(125)

act_info <- w125(paste0(unname(acts[as.character(psm$act)]), collapse = "; "))

ggplot(psm) +
  # dots from 0 to minval
  geom_segment(
    aes(0, act, xend = y2018, yend = act),
    linetype = "dotted", color = "#b2b2b2", size = 0.33
  ) +
  # minval label
  geom_label(
    aes(y2018, act, label = y2018),
    label.size = 0, hjust = 1, size = 3.5, family = font_rc
  ) +
  # maxval label
  geom_label(
    aes(y2017 + (0.0015 * y2017), act, label = y2017),
    label.size = 0, hjust = 0, size = 3.5, family = font_rc
  ) +
  # the measure line+arrow
  geom_segment(
    aes(y2018, act, xend = y2017, yend = act),
    color = "#4a90e2", size = 0.75,
    arrow = arrow(ends = "first", length = unit(5, "pt"))
  ) +
  # top of chart year (min)
  geom_label(
    data = head(psm, 1),
    aes(y2018, 9, label = "2018"),
    hjust = 0, vjust = 1, label.size = 0, size = 3.75, family = font_rc, color = ft_cols$slate
  ) +
  # top of chart year (max)
  geom_label(
    data = head(psm, 1),
    aes(y2017, 9, label = "2017"),
    hjust = 1, vjust = 1, label.size = 0, size = 3.75, family = font_rc, color = ft_cols$slate
  ) +
  # bar from top of chart year label to first minval measure
  geom_segment(
    data = head(psm, 1),
    aes(
      y2018 + (0.005 * max_val), 8.5, 
      xend = y2018 + (0.005 * max_val), yend = 8.25
    ), 
    size = 0.25
  ) +
  # bar from top of chart year label to first maxval measure
  geom_segment(
    data = head(psm, 1),
    aes(
      y2017 - (0.005 * max_val), 8.5, 
      xend = y2017 - (0.005 * max_val), yend = 8.25
    ), 
    size = 0.25
  ) +
  # fix x axis scale and place breaks
  scale_x_comma(limits = c(0, max_val), breaks = seq(0, max_val, 200)) +
  scale_y_discrete(expand = c(0, 1)) +
  labs(
    y = NULL,
    title = "Decline by statute",
    subtitle = "The number of civil cases the EPA brought to conclusion has dropped across a number of federal statutes,\nincluding the Clean Air Act (CAA) and others.",
    x = act_info,
    caption = "Original Chart/Data: The Conversation, CC-BY-ND;<https://bit.ly/2VuJrOT>; Source: Environmental Data & Government Initiative <https://bit.ly/2VpcFyl>"
  ) +
  theme_ipsum_rc(grid = "X") +
  theme(axis.text.x = element_text(color = ft_cols$slate)) +
  theme(axis.title.x = element_text(
    hjust = 0, size = 10, face = "italic", color = ft_cols$gray, margin = margin(t = 10)
  )) +
  theme(plot.caption = element_text(hjust = 0))

devtools::session_info()
## ─ Session info ──────────────────────────────────────────────────────────
##  setting  value                                 
##  version  R version 3.5.2 RC (2018-12-17 r75868)
##  os       macOS Mojave 10.14.3                  
##  system   x86_64, darwin15.6.0                  
##  ui       RStudio                               
##  language (EN)                                  
##  collate  en_US.UTF-8                           
##  ctype    en_US.UTF-8                           
##  tz       America/New_York                      
##  date     2019-01-06                            
## 
## ─ Packages ──────────────────────────────────────────────────────────────
##  package     * version    date       lib source                         
##  assertthat    0.2.0      2017-04-11 [1] CRAN (R 3.5.0)                 
##  backports     1.1.2      2017-12-13 [1] CRAN (R 3.5.0)                 
##  base64enc     0.1-3      2015-07-28 [1] CRAN (R 3.5.0)                 
##  bindr         0.1.1      2018-03-13 [1] CRAN (R 3.5.0)                 
##  bindrcpp    * 0.2.2      2018-03-29 [1] CRAN (R 3.5.0)                 
##  broom         0.5.1      2018-12-05 [1] CRAN (R 3.5.1)                 
##  callr         3.0.0      2018-08-24 [1] CRAN (R 3.5.0)                 
##  cellranger    1.1.0      2016-07-27 [1] CRAN (R 3.5.0)                 
##  cli           1.0.1      2018-09-25 [1] CRAN (R 3.5.0)                 
##  colorspace    1.3-2      2016-12-14 [1] CRAN (R 3.5.0)                 
##  crayon        1.3.4      2017-09-16 [1] CRAN (R 3.5.0)                 
##  curl          3.2        2018-03-28 [1] CRAN (R 3.5.0)                 
##  debugme       1.1.0      2017-10-22 [1] CRAN (R 3.5.0)                 
##  desc          1.2.0      2018-05-01 [1] CRAN (R 3.5.0)                 
##  devtools    * 2.0.1      2018-10-26 [1] CRAN (R 3.5.1)                 
##  digest        0.6.18     2018-10-10 [1] CRAN (R 3.5.0)                 
##  dplyr       * 0.7.8      2018-11-10 [1] CRAN (R 3.5.0)                 
##  evaluate      0.12       2018-10-09 [1] CRAN (R 3.5.0)                 
##  extrafont     0.17       2014-12-08 [1] CRAN (R 3.5.0)                 
##  extrafontdb   1.0        2012-06-11 [1] CRAN (R 3.5.0)                 
##  fansi         0.4.0      2018-10-05 [1] CRAN (R 3.5.0)                 
##  forcats     * 0.3.0      2018-02-19 [1] CRAN (R 3.5.0)                 
##  fs            1.2.6      2018-08-23 [1] CRAN (R 3.5.0)                 
##  generics      0.0.2      2018-11-29 [1] CRAN (R 3.5.0)                 
##  ggplot2     * 3.1.0      2018-10-25 [1] CRAN (R 3.5.0)                 
##  glue          1.3.0      2018-12-06 [1] Github (tidyverse/glue@35c61e9)
##  gtable        0.2.0      2016-02-26 [1] CRAN (R 3.5.0)                 
##  haven         2.0.0      2018-11-22 [1] CRAN (R 3.5.0)                 
##  hms           0.4.2      2018-03-10 [1] CRAN (R 3.5.0)                 
##  hrbrthemes  * 0.5.0      2018-12-06 [1] local                          
##  htmltools     0.3.6      2017-04-28 [1] CRAN (R 3.5.0)                 
##  httr          1.3.1      2017-08-20 [1] CRAN (R 3.5.0)                 
##  jsonlite      1.5        2017-06-01 [1] CRAN (R 3.5.0)                 
##  knitr         1.20       2018-02-20 [1] CRAN (R 3.5.0)                 
##  lattice       0.20-38    2018-11-04 [1] CRAN (R 3.5.2)                 
##  lazyeval      0.2.1      2017-10-29 [1] CRAN (R 3.5.0)                 
##  lubridate     1.7.4      2018-04-11 [1] CRAN (R 3.5.0)                 
##  magrittr      1.5        2014-11-22 [1] CRAN (R 3.5.0)                 
##  memoise       1.1.0      2017-04-21 [1] CRAN (R 3.5.0)                 
##  modelr        0.1.2      2018-05-11 [1] CRAN (R 3.5.0)                 
##  munsell       0.5.0      2018-06-12 [1] CRAN (R 3.5.0)                 
##  nlme          3.1-137    2018-04-07 [1] CRAN (R 3.5.2)                 
##  pillar        1.3.0      2018-07-14 [1] CRAN (R 3.5.0)                 
##  pkgbuild      1.0.2.9000 2018-12-05 [1] Github (r-lib/pkgbuild@6e4ebdf)
##  pkgconfig     2.0.2      2018-08-16 [1] CRAN (R 3.5.0)                 
##  pkgload       1.0.2      2018-10-29 [1] CRAN (R 3.5.0)                 
##  plyr          1.8.4      2016-06-08 [1] CRAN (R 3.5.0)                 
##  prettyunits   1.0.2      2015-07-13 [1] CRAN (R 3.5.0)                 
##  processx      3.2.0      2018-08-16 [1] CRAN (R 3.5.0)                 
##  ps            1.2.1      2018-11-06 [1] CRAN (R 3.5.0)                 
##  purrr       * 0.2.5      2018-05-29 [1] CRAN (R 3.5.0)                 
##  R6            2.3.0      2018-10-04 [1] CRAN (R 3.5.0)                 
##  Rcpp          1.0.0      2018-11-07 [1] CRAN (R 3.5.0)                 
##  readr       * 1.2.1      2018-11-22 [1] CRAN (R 3.5.0)                 
##  readxl        1.1.0      2018-04-20 [1] CRAN (R 3.5.0)                 
##  remotes       2.0.2      2018-10-30 [1] CRAN (R 3.5.0)                 
##  rlang         0.3.0.9001 2018-12-06 [1] Github (r-lib/rlang@05f778f)   
##  rmarkdown     1.10       2018-06-11 [1] CRAN (R 3.5.0)                 
##  rprojroot     1.3-2      2018-01-03 [1] CRAN (R 3.5.0)                 
##  rstudioapi    0.8        2018-10-02 [1] CRAN (R 3.5.0)                 
##  Rttf2pt1      1.3.7      2018-06-29 [1] CRAN (R 3.5.0)                 
##  rvest       * 0.3.2      2016-06-17 [1] CRAN (R 3.5.0)                 
##  scales        1.0.0.9000 2018-12-06 [1] Github (hadley/scales@7cd8121) 
##  selectr       0.4-1      2018-04-06 [1] CRAN (R 3.5.0)                 
##  sessioninfo   1.1.1      2018-11-05 [1] CRAN (R 3.5.0)                 
##  stringi     * 1.2.4      2018-07-20 [1] CRAN (R 3.5.0)                 
##  stringr     * 1.3.1      2018-05-10 [1] CRAN (R 3.5.0)                 
##  testthat      2.0.1      2018-10-13 [1] CRAN (R 3.5.0)                 
##  tibble      * 1.4.2      2018-01-22 [1] CRAN (R 3.5.0)                 
##  tidyr       * 0.8.2      2018-10-28 [1] CRAN (R 3.5.0)                 
##  tidyselect    0.2.5      2018-10-11 [1] CRAN (R 3.5.0)                 
##  tidyverse   * 1.2.1      2017-11-14 [1] CRAN (R 3.5.0)                 
##  usethis     * 1.4.0      2018-08-14 [1] CRAN (R 3.5.0)                 
##  utf8          1.1.4      2018-05-24 [1] CRAN (R 3.5.0)                 
##  withr         2.1.2      2018-03-15 [1] CRAN (R 3.5.0)                 
##  xml2        * 1.2.0      2018-01-24 [1] CRAN (R 3.5.0)                 
## 
## [1] /Library/Frameworks/R.framework/Versions/3.5/Resources/library