duttashi / visualizer

My experiments in data visualizations. Feel free to show your :heart: by giving a star :star:
MIT License
15 stars 1 forks source link

Coloring ggplot2 axis tick labels based on data displayed at axis tick positions #46

Closed duttashi closed 6 years ago

duttashi commented 6 years ago

How to make a column graph that has the y-axis text mirror the fill color in the graph itself?

# create dummy data
top_bot_5_both <- structure(list(
  name = structure(c(20L, 19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 
                     11L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), 
                   .Label = c("Michele Bachmann", "Donald Trump", "Ted Cruz", 
                              "Newt Gingrich", "Rick Santorum", "Terry McAuliffe", 
                              "Nancy Pelosi", "Debbie Wasserman Schultz", 
                              "Tammy Baldwin", "Joe Biden", "Rand Paul", "Jeb Bush", 
                              "John Kasich", "Barack Obama", "Bill Clinton", 
                              "Hillary Clinton", "Nathan Deal", "Tim Kaine", 
                              "Rob Portman", "Sherrod Brown"), 
                   class = "factor"),
  Party = c("Democratic", "Republican", "Democratic", "Republican", "Democratic", 
            "Democratic", "Democratic", "Republican", "Republican", "Republican", 
            "Republican", "Republican", "Republican", "Republican", "Republican", 
            "Democratic", "Democratic", "Democratic", "Democratic", "Democratic"), 
  total_ratings = c(35L, 48L, 51L, 49L, 296L, 41L, 599L, 64L, 80L, 55L, 
                    61L, 472L, 123L, 82L, 61L, 31L, 35L, 48L, 33L, 75L), 
  sum = c(22, 29, 21, 18, 96, 12, 172, 16, 18, 2, -86, -525, -94, -57, 
          -42, -19, -14, -7, -4, -1), 
  score = c(0.628571428571429, 0.604166666666667, 0.411764705882353, 
            0.36734693877551, 0.324324324324324, 0.292682926829268, 
            0.287145242070117, 0.25, 0.225, 0.0363636363636364, -1.40983606557377, 
            -1.11228813559322, -0.764227642276423, -0.695121951219512, 
            -0.688524590163934, -0.612903225806452, -0.4, -0.145833333333333, 
            -0.121212121212121, -0.0133333333333333)), 
  class = c("tbl_df", "tbl", "data.frame"), 
  row.names = c(NA, -20L), 
  .Names = c("name", "Party", "total_ratings", "sum", "score"))
duttashi commented 6 years ago

Note: This question was originally asked on SO

Solution:

a) Create a variable colors and assign it color values like, top_bot_5_both <- top_bot_5_both %>% mutate(color = ifelse(Party == "Democratic", "#1A80C4", "#CC3D3D"))

b)

ggplot(top_bot_5_both, aes(x = name, y = score, fill = Party)) +
  geom_col(size = 1, color = "black") +
  coord_flip() +
  geom_vline(xintercept = 10.5, size = 1.5, linetype = "twodash") +
  scale_fill_manual(values = c("Democratic" = "#1A80C4", "Republican" = "#CC3D3D")) +
  theme(axis.text = element_text(size = 12),
        axis.text.y = element_text(color = colors),
        axis.title = element_text(size = 14),
        legend.position = "bottom", 
        legend.title = element_blank())

See the plot