Introduction

The United States Senate is comprised of two senators elected from each state every six years. The institution was designed for slow, stable deliberations that are independent of the pressures and passions of day to day politics. But that doesn’t mean Senators are free from partisanship. Recently (and currently - as of the time of this writing) the Senate has engaged in fiercely partisan debates over the best way to kill the Affordable Care Act. Additionally, at the outset of the Trump administration, there have been hot contests about Trump administration appointees and Mitch McConnell’s successful gambit to steal a Supreme Court seat - all of which have covered the full range of economic and social issues in the country.

Partisanship is just as important to the Senate as any other deliberative body. To track legislative partisanship, Keith T. Poole and Howard Rosenthal developed the DW-NOMINATE metric. It’s tracked for social and economic issues separately with adjustments made for issue salience over time.

How To Make A Ridge Plot

My goal here is to make a plot that displays the distribution of DW-NOMINATE scores for each party over the last 50 years or so. To do that, I downloaded the DW-NOMINATE data here and loaded the ggridges, ggplot2, dplyr and yaztheme (a custom ggplot theme I use in ggplot visualizations) packages. I also read in the DW-NOMINATE data from a csv I stored in a folder on my desktop and limit the sample to Senators (congressional district = 0 to exclude House members and state not equal to “USA” to exclude Vice Presidents).

library(dplyr)
dwnominate <- read.csv('/Users/joshyazman/Desktop/dwnominate_fun/dwnominate.csv')%>%
  filter(congress >= 95 & cd == 0 & state != 'USA' & party_code %in% c(100,200))

Now I want to make a distribution plot for just one congress to demonstrate the ggplot code involved in one row of the ridge plot. The final output of this plot will have two sets of ridge diagrams side by side.

library(ggplot2)
# devtools::install_github('yaztheme','joshyazman')
library(yaztheme)
ggplot(dwnominate%>%filter(congress == '113'), aes(x = dim.a, fill = as.character(party_code)))+
    geom_density(alpha = .5)+
    scale_fill_manual(values = yaz_cols, name = 'Party',labels = c('Democrat','Republican'))+
    yaztheme::theme_yaz()+
    labs(x = 'DW-Nominate Score',
         y = element_blank(),
         title = 'Polarization of the 113th Senate',
         subtitle = 'Session 113: Dimension 1 - Economic Ideology')+
      xlim(-1,1)

Finally, I’ll use the ggridges package to create the above plot for every congress and stack them on top of one another. I’ll do this separately for each DW-NOMINATE score and place them next to one another using the gridExtra package. Color is mapped to party with red representing Republicans and blue representing Democrats. Additionally, the fill color is set to 50% transparency because there is some overlap in almost all lines of the ridge diagram.

library(ggridges)
library(gridExtra)
grid.arrange(
  ggplot(dwnominate, aes(x = dim.a, y = reorder(as.character(congress), desc(congress)),
                         fill = as.character(party_code)))+
    geom_density_ridges(alpha = .5)+
    scale_fill_manual(values = yaz_cols, name = 'Party',labels = c('Democrat','Republican'))+
    yaztheme::theme_yaz()+
    labs(y = 'Congress',
         x = element_blank(),
         title = element_blank(),
         subtitle = 'Senate DW-Nominate Dimension 1 - Economic Ideology'),
    ggplot(dwnominate, aes(x = dim.b*-1, y = reorder(as.character(congress), desc(congress)),
                           fill = as.character(party_code)))+
      geom_density_ridges(alpha = .5)+
      scale_fill_manual(values = yaz_cols, name = 'Party',labels = c('Democrat','Republican'))+
      yaztheme::theme_yaz()+
      labs(y = 'Congress',
           x = element_blank(),
         title = element_blank(),
           subtitle = 'Senate DW-Nominate Dimension 2 - Social Ideology'),
  nrow = 1
)

Analysis

These two plots demonstrate asymmetric polarization in the Senate over the last 40 years on economic issues. Democrats have largely stayeed clustered around -.05 indicating a center-left lean. Republicans have moved from very broad distributions that often ventured into liberal territory to a more uniformly conservative distribution clustered around 0.5-0.7. On social issues we see the opposite trend. There have always been some conservative Democrats and liberal Republicans, but voting behavior on social issues has largely converged over time.

LS0tCnRpdGxlOiAiVHJhY2tpbmcgU2VuYXRlIFBhcnRpc2Fuc2hpcCB3aXRoIGdncmlkZ2VzIgphdXRob3I6ICdKb3NoIFlhem1hbicKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgSW50cm9kdWN0aW9uClRoZSBVbml0ZWQgU3RhdGVzIFNlbmF0ZSBpcyBjb21wcmlzZWQgb2YgdHdvIHNlbmF0b3JzIGVsZWN0ZWQgZnJvbSBlYWNoIHN0YXRlIGV2ZXJ5IHNpeCB5ZWFycy4gVGhlIGluc3RpdHV0aW9uIHdhcyBkZXNpZ25lZCBmb3Igc2xvdywgc3RhYmxlIGRlbGliZXJhdGlvbnMgdGhhdCBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIHByZXNzdXJlcyBhbmQgcGFzc2lvbnMgb2YgZGF5IHRvIGRheSBwb2xpdGljcy4gQnV0IHRoYXQgZG9lc24ndCBtZWFuIFNlbmF0b3JzIGFyZSBmcmVlIGZyb20gcGFydGlzYW5zaGlwLiBSZWNlbnRseSAoYW5kIGN1cnJlbnRseSAtIGFzIG9mIHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZykgdGhlIFNlbmF0ZSBoYXMgZW5nYWdlZCBpbiBmaWVyY2VseSBwYXJ0aXNhbiBkZWJhdGVzIG92ZXIgdGhlIGJlc3Qgd2F5IHRvIGtpbGwgdGhlIEFmZm9yZGFibGUgQ2FyZSBBY3QuIEFkZGl0aW9uYWxseSwgYXQgdGhlIG91dHNldCBvZiB0aGUgVHJ1bXAgYWRtaW5pc3RyYXRpb24sIHRoZXJlIGhhdmUgYmVlbiBob3QgY29udGVzdHMgYWJvdXQgVHJ1bXAgYWRtaW5pc3RyYXRpb24gYXBwb2ludGVlcyBhbmQgTWl0Y2ggTWNDb25uZWxsJ3Mgc3VjY2Vzc2Z1bCBnYW1iaXQgdG8gc3RlYWwgYSBTdXByZW1lIENvdXJ0IHNlYXQgLSBhbGwgb2Ygd2hpY2ggaGF2ZSBjb3ZlcmVkIHRoZSBmdWxsIHJhbmdlIG9mIGVjb25vbWljIGFuZCBzb2NpYWwgaXNzdWVzIGluIHRoZSBjb3VudHJ5LiAKClBhcnRpc2Fuc2hpcCBpcyBqdXN0IGFzIGltcG9ydGFudCB0byB0aGUgU2VuYXRlIGFzIGFueSBvdGhlciBkZWxpYmVyYXRpdmUgYm9keS4gVG8gdHJhY2sgbGVnaXNsYXRpdmUgcGFydGlzYW5zaGlwLCBLZWl0aCBULiBQb29sZSBhbmQgSG93YXJkIFJvc2VudGhhbCBkZXZlbG9wZWQgdGhlIFtEVy1OT01JTkFURV0oaHR0cHM6Ly92b3Rldmlldy5jb20vYWJvdXQpIG1ldHJpYy4gSXQncyB0cmFja2VkIGZvciBzb2NpYWwgYW5kIGVjb25vbWljIGlzc3VlcyBzZXBhcmF0ZWx5IHdpdGggYWRqdXN0bWVudHMgbWFkZSBmb3IgaXNzdWUgc2FsaWVuY2Ugb3ZlciB0aW1lLgoKIyMgSG93IFRvIE1ha2UgQSBSaWRnZSBQbG90Ck15IGdvYWwgaGVyZSBpcyB0byBtYWtlIGEgcGxvdCB0aGF0IGRpc3BsYXlzIHRoZSBkaXN0cmlidXRpb24gb2YgRFctTk9NSU5BVEUgc2NvcmVzIGZvciBlYWNoIHBhcnR5IG92ZXIgdGhlIGxhc3QgNTAgeWVhcnMgb3Igc28uIFRvIGRvIHRoYXQsIEkgZG93bmxvYWRlZCB0aGUgRFctTk9NSU5BVEUgZGF0YSBbaGVyZV0oaHR0cHM6Ly9sZWdhY3kudm90ZXZpZXcuY29tL2R3bm9taW5fam9pbnRfaG91c2VfYW5kX3NlbmF0ZS5odG0pIGFuZCBsb2FkZWQgdGhlIGBnZ3JpZGdlc2AsIGBnZ3Bsb3QyYCwgYGRwbHlyYCBhbmQgW2B5YXp0aGVtZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9qb3NoeWF6bWFuL3lhenRoZW1lKSAoYSBjdXN0b20gZ2dwbG90IHRoZW1lIEkgdXNlIGluIGdncGxvdCB2aXN1YWxpemF0aW9ucykgcGFja2FnZXMuIEkgYWxzbyByZWFkIGluIHRoZSBEVy1OT01JTkFURSBkYXRhIGZyb20gYSBjc3YgSSBzdG9yZWQgaW4gYSBmb2xkZXIgb24gbXkgZGVza3RvcCBhbmQgbGltaXQgdGhlIHNhbXBsZSB0byBTZW5hdG9ycyAoY29uZ3Jlc3Npb25hbCBkaXN0cmljdCA9IDAgdG8gZXhjbHVkZSBIb3VzZSBtZW1iZXJzIGFuZCBzdGF0ZSBub3QgZXF1YWwgdG8gIlVTQSIgdG8gZXhjbHVkZSBWaWNlIFByZXNpZGVudHMpLgpgYGB7ciwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKCmR3bm9taW5hdGUgPC0gcmVhZC5jc3YoJy9Vc2Vycy9qb3NoeWF6bWFuL0Rlc2t0b3AvZHdub21pbmF0ZV9mdW4vZHdub21pbmF0ZS5jc3YnKSU+JQogIGZpbHRlcihjb25ncmVzcyA+PSA5NSAmIGNkID09IDAgJiBzdGF0ZSAhPSAnVVNBJyAmIHBhcnR5X2NvZGUgJWluJSBjKDEwMCwyMDApKQpgYGAKCk5vdyBJIHdhbnQgdG8gbWFrZSBhIGRpc3RyaWJ1dGlvbiBwbG90IGZvciBqdXN0IG9uZSBjb25ncmVzcyB0byBkZW1vbnN0cmF0ZSB0aGUgYGdncGxvdGAgY29kZSBpbnZvbHZlZCBpbiBvbmUgcm93IG9mIHRoZSByaWRnZSBwbG90LiBUaGUgZmluYWwgb3V0cHV0IG9mIHRoaXMgcGxvdCB3aWxsIGhhdmUgdHdvIHNldHMgb2YgcmlkZ2UgZGlhZ3JhbXMgc2lkZSBieSBzaWRlLiAgCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0ID0gMywgZmlnLndpZHRoPTh9CmxpYnJhcnkoZ2dwbG90MikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoJ3lhenRoZW1lJywnam9zaHlhem1hbicpCmxpYnJhcnkoeWF6dGhlbWUpCgpnZ3Bsb3QoZHdub21pbmF0ZSU+JWZpbHRlcihjb25ncmVzcyA9PSAnMTEzJyksIGFlcyh4ID0gZGltLmEsIGZpbGwgPSBhcy5jaGFyYWN0ZXIocGFydHlfY29kZSkpKSsKICAgIGdlb21fZGVuc2l0eShhbHBoYSA9IC41KSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHlhel9jb2xzLCBuYW1lID0gJ1BhcnR5JyxsYWJlbHMgPSBjKCdEZW1vY3JhdCcsJ1JlcHVibGljYW4nKSkrCiAgICB5YXp0aGVtZTo6dGhlbWVfeWF6KCkrCiAgICBsYWJzKHggPSAnRFctTm9taW5hdGUgU2NvcmUnLAogICAgICAgICB5ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICB0aXRsZSA9ICdQb2xhcml6YXRpb24gb2YgdGhlIDExM3RoIFNlbmF0ZScsCiAgICAgICAgIHN1YnRpdGxlID0gJ1Nlc3Npb24gMTEzOiBEaW1lbnNpb24gMSAtIEVjb25vbWljIElkZW9sb2d5JykrCiAgICAgIHhsaW0oLTEsMSkKYGBgCgpGaW5hbGx5LCBJJ2xsIHVzZSB0aGUgYGdncmlkZ2VzYCBwYWNrYWdlIHRvIGNyZWF0ZSB0aGUgYWJvdmUgcGxvdCBmb3IgZXZlcnkgY29uZ3Jlc3MgYW5kIHN0YWNrIHRoZW0gb24gdG9wIG9mIG9uZSBhbm90aGVyLiBJJ2xsIGRvIHRoaXMgc2VwYXJhdGVseSBmb3IgZWFjaCBEVy1OT01JTkFURSBzY29yZSBhbmQgcGxhY2UgdGhlbSBuZXh0IHRvIG9uZSBhbm90aGVyIHVzaW5nIHRoZSBgZ3JpZEV4dHJhYCBwYWNrYWdlLiBDb2xvciBpcyBtYXBwZWQgdG8gcGFydHkgd2l0aCByZWQgcmVwcmVzZW50aW5nIFJlcHVibGljYW5zIGFuZCBibHVlIHJlcHJlc2VudGluZyBEZW1vY3JhdHMuIEFkZGl0aW9uYWxseSwgdGhlIGZpbGwgY29sb3IgaXMgc2V0IHRvIDUwJSB0cmFuc3BhcmVuY3kgYmVjYXVzZSB0aGVyZSBpcyBzb21lIG92ZXJsYXAgaW4gYWxtb3N0IGFsbCBsaW5lcyBvZiB0aGUgcmlkZ2UgZGlhZ3JhbS4gCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGggPSAxMH0KbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeShncmlkRXh0cmEpCmdyaWQuYXJyYW5nZSgKICBnZ3Bsb3QoZHdub21pbmF0ZSwgYWVzKHggPSBkaW0uYSwgeSA9IHJlb3JkZXIoYXMuY2hhcmFjdGVyKGNvbmdyZXNzKSwgZGVzYyhjb25ncmVzcykpLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmNoYXJhY3RlcihwYXJ0eV9jb2RlKSkpKwogICAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYSA9IC41KSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHlhel9jb2xzLCBuYW1lID0gJ1BhcnR5JyxsYWJlbHMgPSBjKCdEZW1vY3JhdCcsJ1JlcHVibGljYW4nKSkrCiAgICB5YXp0aGVtZTo6dGhlbWVfeWF6KCkrCiAgICBsYWJzKHkgPSAnQ29uZ3Jlc3MnLAogICAgICAgICB4ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICB0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgc3VidGl0bGUgPSAnU2VuYXRlIERXLU5vbWluYXRlIERpbWVuc2lvbiAxIC0gRWNvbm9taWMgSWRlb2xvZ3knKSwKICAgIGdncGxvdChkd25vbWluYXRlLCBhZXMoeCA9IGRpbS5iKi0xLCB5ID0gcmVvcmRlcihhcy5jaGFyYWN0ZXIoY29uZ3Jlc3MpLCBkZXNjKGNvbmdyZXNzKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBhcy5jaGFyYWN0ZXIocGFydHlfY29kZSkpKSsKICAgICAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYSA9IC41KSsKICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0geWF6X2NvbHMsIG5hbWUgPSAnUGFydHknLGxhYmVscyA9IGMoJ0RlbW9jcmF0JywnUmVwdWJsaWNhbicpKSsKICAgICAgeWF6dGhlbWU6OnRoZW1lX3lheigpKwogICAgICBsYWJzKHkgPSAnQ29uZ3Jlc3MnLAogICAgICAgICAgIHggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgIHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgIHN1YnRpdGxlID0gJ1NlbmF0ZSBEVy1Ob21pbmF0ZSBEaW1lbnNpb24gMiAtIFNvY2lhbCBJZGVvbG9neScpLAogIG5yb3cgPSAxCikKYGBgCgojIyBBbmFseXNpcwpUaGVzZSB0d28gcGxvdHMgZGVtb25zdHJhdGUgYXN5bW1ldHJpYyBwb2xhcml6YXRpb24gaW4gdGhlIFNlbmF0ZSBvdmVyIHRoZSBsYXN0IDQwIHllYXJzIG9uIGVjb25vbWljIGlzc3Vlcy4gRGVtb2NyYXRzIGhhdmUgbGFyZ2VseSBzdGF5ZWVkIGNsdXN0ZXJlZCBhcm91bmQgLS4wNSBpbmRpY2F0aW5nIGEgY2VudGVyLWxlZnQgbGVhbi4gUmVwdWJsaWNhbnMgaGF2ZSBtb3ZlZCBmcm9tIHZlcnkgYnJvYWQgZGlzdHJpYnV0aW9ucyB0aGF0IG9mdGVuIHZlbnR1cmVkIGludG8gbGliZXJhbCB0ZXJyaXRvcnkgdG8gYSBtb3JlIHVuaWZvcm1seSBjb25zZXJ2YXRpdmUgZGlzdHJpYnV0aW9uIGNsdXN0ZXJlZCBhcm91bmQgMC41LTAuNy4gT24gc29jaWFsIGlzc3VlcyB3ZSBzZWUgdGhlIG9wcG9zaXRlIHRyZW5kLiBUaGVyZSBoYXZlIGFsd2F5cyBiZWVuIHNvbWUgY29uc2VydmF0aXZlIERlbW9jcmF0cyBhbmQgbGliZXJhbCBSZXB1YmxpY2FucywgYnV0IHZvdGluZyBiZWhhdmlvciBvbiBzb2NpYWwgaXNzdWVzIGhhcyBsYXJnZWx5IGNvbnZlcmdlZCBvdmVyIHRpbWUuIAo=