Basic usage only requires this package and ggplot2
:
The cartograms need data and the best way to do that is by obtaining
roll call vote data from ProPublica via the roll_call()
function. Data can be retrieved for any House or Senate vote by
specificing the target vote parameters:
Their structures look the same and there is a print-method to make the console output easier on the eyes:
str(sen)
#> List of 29
#> $ vote_id : chr "S_115_1_110"
#> $ chamber : chr "Senate"
#> $ year : int 2017
#> $ congress : chr "115"
#> $ session : chr "1"
#> $ roll_call : int 110
#> $ needed_to_pass : int 51
#> $ date_of_vote : chr "April 6, 2017"
#> $ time_of_vote : chr "12:35 PM"
#> $ result : chr "Cloture Motion Agreed to"
#> $ vote_type : chr "1/2"
#> $ question : chr "On the Cloture Motion"
#> $ description : chr "Neil M. Gorsuch, of Colorado, to be an Associate Justice of the Supreme Court of the United States"
#> $ nyt_title : chr "On the Cloture Motion"
#> $ total_yes : int 55
#> $ total_no : int 45
#> $ total_not_voting : int 0
#> $ gop_yes : int 52
#> $ gop_no : int 0
#> $ gop_not_voting : int 0
#> $ dem_yes : int 3
#> $ dem_no : int 43
#> $ dem_not_voting : int 0
#> $ ind_yes : int 0
#> $ ind_no : int 2
#> $ ind_not_voting : int 0
#> $ dem_majority_position: chr "No"
#> $ gop_majority_position: chr "Yes"
#> $ votes : tibble [100 × 11] (S3: tbl_df/tbl/data.frame)
#> ..$ bioguide_id : chr [1:100] "A000360" "B001230" "B001261" "B001267" ...
#> ..$ role_id : int [1:100] 526 481 498 561 535 547 507 551 480 555 ...
#> ..$ member_name : chr [1:100] "Lamar Alexander" "Tammy Baldwin" "John Barrasso" "Michael Bennet" ...
#> ..$ sort_name : chr [1:100] "Alexander" "Baldwin" "Barrasso" "Bennet" ...
#> ..$ party : chr [1:100] "R" "D" "R" "D" ...
#> ..$ state_abbrev : chr [1:100] "TN" "WI" "WY" "CO" ...
#> ..$ display_state_abbrev: chr [1:100] "Tenn." "Wis." "Wyo." "Colo." ...
#> ..$ district : chr [1:100] "2" "1" "1" "1" ...
#> ..$ position : chr [1:100] "Yes" "No" "Yes" "No" ...
#> ..$ dw_nominate : logi [1:100] NA NA NA NA NA NA ...
#> ..$ pp_id : chr [1:100] "TN" "WI" "WY" "CO" ...
#> - attr(*, "class")= chr [1:2] "pprc" "list"
sen$votes
#> # A tibble: 100 × 11
#> biogu…¹ role_id membe…² sort_…³ party state…⁴ displ…⁵ distr…⁶ posit…⁷ dw_no…⁸
#> * <chr> <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <lgl>
#> 1 A000360 526 Lamar … Alexan… R TN Tenn. 2 Yes NA
#> 2 B001230 481 Tammy … Baldwin D WI Wis. 1 No NA
#> 3 B001261 498 John B… Barras… R WY Wyo. 1 Yes NA
#> 4 B001267 561 Michae… Bennet D CO Colo. 1 No NA
#> 5 B001277 535 Richar… Blumen… D CT Conn. 2 No NA
#> 6 B000575 547 Roy B… Blunt R MO Mo. 2 Yes NA
#> 7 B001288 507 Cory … Booker D NJ N.J. 2 No NA
#> 8 B001236 551 John … Boozman R AR Ark. 1 Yes NA
#> 9 B000944 480 Sherro… Brown D OH Ohio 1 No NA
#> 10 B001135 555 Richar… Burr R NC N.C. 1 Yes NA
#> # … with 90 more rows, 1 more variable: pp_id <chr>, and abbreviated variable
#> # names ¹bioguide_id, ²member_name, ³sort_name, ⁴state_abbrev,
#> # ⁵display_state_abbrev, ⁶district, ⁷position, ⁸dw_nominate
str(rep)
#> List of 29
#> $ vote_id : chr "H_115_1_256"
#> $ chamber : chr "House"
#> $ year : int 2017
#> $ congress : chr "115"
#> $ session : chr "1"
#> $ roll_call : int 256
#> $ needed_to_pass : int 216
#> $ date_of_vote : chr "May 4, 2017"
#> $ time_of_vote : chr "02:18 PM"
#> $ result : chr "Passed"
#> $ vote_type : chr "RECORDED VOTE"
#> $ question : chr "On Passage"
#> $ description : chr "American Health Care Act"
#> $ nyt_title : chr "On Passage"
#> $ total_yes : int 217
#> $ total_no : int 213
#> $ total_not_voting : int 1
#> $ gop_yes : int 217
#> $ gop_no : int 20
#> $ gop_not_voting : int 1
#> $ dem_yes : int 0
#> $ dem_no : int 193
#> $ dem_not_voting : int 0
#> $ ind_yes : int 0
#> $ ind_no : int 0
#> $ ind_not_voting : int 0
#> $ dem_majority_position: chr "No"
#> $ gop_majority_position: chr "Yes"
#> $ votes : tibble [435 × 11] (S3: tbl_df/tbl/data.frame)
#> ..$ bioguide_id : chr [1:435] "A000374" "A000370" "A000055" "A000371" ...
#> ..$ role_id : int [1:435] 274 294 224 427 268 131 388 320 590 206 ...
#> ..$ member_name : chr [1:435] "Ralph Abraham" "Alma Adams" "Robert B. Aderholt" "Pete Aguilar" ...
#> ..$ sort_name : chr [1:435] "Abraham" "Adams" "Aderholt" "Aguilar" ...
#> ..$ party : chr [1:435] "R" "D" "R" "D" ...
#> ..$ state_abbrev : chr [1:435] "LA" "NC" "AL" "CA" ...
#> ..$ display_state_abbrev: chr [1:435] "La." "N.C." "Ala." "Calif." ...
#> ..$ district : int [1:435] 5 12 4 31 12 3 2 19 36 2 ...
#> ..$ position : chr [1:435] "Yes" "No" "Yes" "No" ...
#> ..$ dw_nominate : logi [1:435] NA NA NA NA NA NA ...
#> ..$ pp_id : chr [1:435] "LA_5" "NC_12" "AL_4" "CA_31" ...
#> - attr(*, "class")= chr [1:2] "pprc" "list"
fortify(rep)
#> # A tibble: 435 × 11
#> biogu…¹ role_id membe…² sort_…³ party state…⁴ displ…⁵ distr…⁶ posit…⁷ dw_no…⁸
#> * <chr> <int> <chr> <chr> <chr> <chr> <chr> <int> <chr> <lgl>
#> 1 A000374 274 Ralph … Abraham R LA La. 5 Yes NA
#> 2 A000370 294 Alma … Adams D NC N.C. 12 No NA
#> 3 A000055 224 Robert… Aderho… R AL Ala. 4 Yes NA
#> 4 A000371 427 Pete A… Aguilar D CA Calif. 31 No NA
#> 5 A000372 268 Rick A… Allen R GA Ga. 12 Yes NA
#> 6 A000367 131 Justin… Amash R MI Mich. 3 Yes NA
#> 7 A000369 388 Mark A… Amodei R NV Nev. 2 Yes NA
#> 8 A000375 320 Jodey … Arring… R TX Texas 19 Yes NA
#> 9 B001291 590 Brian … Babin R TX Texas 36 Yes NA
#> 10 B001298 206 Don Ba… Bacon R NE Neb. 2 Yes NA
#> # … with 425 more rows, 1 more variable: pp_id <chr>, and abbreviated variable
#> # names ¹bioguide_id, ²member_name, ³sort_name, ⁴state_abbrev,
#> # ⁵display_state_abbrev, ⁶district, ⁷position, ⁸dw_nominate
That data may be useful on its own (ouside of plotting).
Note, also, that ggplot2
’s fortify()
method
uses the provided object class method for roll call objects to know how
to extract the rectangular data necessary for plotting.
These cartograms have a few style options:
senate_carto(sen) +
labs(title="Senate Vote 110 - Invokes Cloture on Neil Gorsuch Nomination") +
theme_voteogram()