ggplot dotplot to show a dot for each person

Viewed 83

with ggplot, i'd like to show 4 quartiles in percent as 400 people (100 each quartile) as a separate dot for each person broken down by gender

library(tidyverse)
dat_url <- 'https://gender-pay-gap.service.gov.uk/viewing/download-data/2019'
dat <- read_csv(dat_url) 

a <- dat %>% 
  filter(str_detect(EmployerName,'ZELLIS')) %>% # pick a company
  select(matches("\\bMale\\w+le", perl=TRUE)) %>% # grab male quartiles
  pivot_longer(everything()) %>% 
  extract(name, c('gender', 'quartile'), '(\\bMale)(\\w+\\b)') %>% 
  mutate(men=round(value), women = 100 - men) %>% 
  select(-c(gender, value)) %>% 
  pivot_longer(c('men','women'), names_to='gender', values_to='value') %>% 
  mutate(quartile = str_replace(quartile,'(^\\w+?)(Middle)', '\\2\\1'))

sample data:

 a
# A tibble: 8 x 3
  quartile            gender value
  <chr>               <chr>  <dbl>
1 LowerQuartile       men       39
2 LowerQuartile       women     61
3 LowerMiddleQuartile men       39
4 LowerMiddleQuartile women     61
5 UpperMiddleQuartile men       57
6 UpperMiddleQuartile women     43
7 TopQuartile         men       64
8 TopQuartile         women     36

to look somewhat like this: enter image description here

1 Answers

Here's one possibility. You could "uncount" the data so you have one row per dot, then draw the points with a square shape. Here's how that might look

a %>% uncount(value) %>% 
  group_by(quartile) %>% 
  mutate(row = (row_number() -1)%/% 10 + 1,
         col = (row_number() -1) %% 10 + 1) %>% 
  ggplot() + 
  aes(col, row, color=gender) + 
  geom_point(shape=15) + 
  facet_grid(~quartile) + 
  coord_equal() + 
  theme(axis.ticks.x=element_blank(), axis.ticks.y=element_blank(),
        axis.text.x=element_blank(), axis.text.y=element_blank(),
        axis.title.x=element_blank(), axis.title.y=element_blank())

enter image description here

Related