1

if there's a way to plot this using ggplot2 or similar it would save my day. I have likert scale data about employee benefits. One question will ask about how important is the benefit and the next will ask how satisfied the employee is with the benefit.


dat <- structure(list(`Medical Insurance` = structure(c(3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Neutral / Undecided", 
"Not at all Important", "Very Important"), class = "factor"), 
    `Medical: Overall` = structure(c(3L, 3L, 4L, 4L, 4L, 3L, 
    4L, 4L, 3L, 3L), .Label = c("Don't Use", "Less Satisfied", 
    "Satisfied", "Very Satisfied"), class = "factor"), `Wellness Program` = structure(c(3L, 
    3L, 1L, 3L, 3L, 1L, 3L, 3L, 3L, 1L), .Label = c("Neutral / Undecided", 
    "Not at all Important", "Very Important"), class = "factor"), 
    `Medical: Wellness Program` = structure(c(3L, 3L, 4L, 4L, 
    4L, 3L, 3L, 4L, 3L, 1L), .Label = c("Don't Use", "Less Satisfied", 
    "Satisfied", "Very Satisfied"), class = "factor"), `Employee Assistance Program` = structure(c(1L, 
    3L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 1L), .Label = c("Neutral / Undecided", 
    "Not at all Important", "Very Important"), class = "factor"), 
    `Employee Assistance Program2` = structure(c(1L, 4L, 3L, 
    1L, 4L, 1L, 3L, 4L, 2L, 1L), .Label = c("Don't Use", "Less Satisfied", 
    "Satisfied", "Very Satisfied"), class = "factor")), row.names = c(NA, 
10L), class = "data.frame")

And I can plot each of the scales separately:

ben.imp <- dat[,seq(1,5,2)]
ben.sat <- dat[,seq(2,6,2)]

library(ggthemes)
library(stringr)
library(sjPlot)
library(sjmisc)
library(ggplot2)
library(wesanderson)

col2 <- c(wes_palettes$GrandBudapest1[2],wes_palettes$Cavalcanti1[4])

likert.ben <- plot_likert(ben.imp, cat.neutral = 1, sort.frq="neg.desc", reverse.colors=T, values = "show",
            show.n=F, digits=0, show.prc.sign=T, show.legend=T, geom.colors=col2, cat.neutral.color=col1[1])+  
                    theme(
                legend.title=element_text(size=14), 
                axis.text=element_text(size=12, face="bold"),
                    legend.text=element_text(size=12),               
                panel.background = element_rect(fill = "transparent",colour = NA),
                    plot.background = element_rect(fill = "transparent",colour = NA),
                    #panel.border=element_blank(),
                    panel.grid.major=element_blank(),
                    panel.grid.minor=element_blank()
                    )+
                guides(fill = guide_legend(reverse=TRUE))+
    geom_text(size=5, position = position_dodge2(width=0.9), vjust=0)



col4 <- c("gray", wes_palettes$GrandBudapest1[2],wes_palettes$Darjeeling2[4], wes_palettes$Cavalcanti1[4])

likert.bensat <- plot_likert(ben.sat, catcount=4,  sort.frq="neg.desc", 
                     reverse.colors=T, values = "show",
            show.n=F, digits=0, show.prc.sign=T, show.legend=T, geom.colors=col4, cat.neutral.color=col1[1])+  
                    theme(
                legend.title=element_text(size=14), 
                axis.text=element_text(size=12, face="bold"),
                    legend.text=element_text(size=12),               
                panel.background = element_rect(fill = "transparent",colour = NA),
                    plot.background = element_rect(fill = "transparent",colour = NA),
                    #panel.border=element_blank(),
                    panel.grid.major=element_blank(),
                    panel.grid.minor=element_blank()
                    )+
                guides(fill = guide_legend(reverse=TRUE))+
    geom_text(size=5, position = position_dodge2(width=0.9), vjust=0)

But I would like to see a plot like this:

enter image description here

How easy would that be? Or do I need to just do it in photoshop? :/

JeniFav
  • 113
  • 1
  • 9

1 Answers1

2

I don't know if you can do this with plot_likert, but you can do it natively with ggplot. You need to reshape your data a bit first though:

library(tidyr)
library(dplyr)

names(ben.imp) <- c("Insurance", "Wellness", "Assistance")
names(ben.sat) <- c("Insurance", "Wellness", "Assistance")

ben.imp <- pivot_longer(ben.imp, 1:3) %>% mutate(class = "Importance")
ben.sat <- pivot_longer(ben.sat, 1:3) %>% mutate(class = "Satisfaction")

df <- rbind(ben.imp, ben.sat)
df$value <- factor(df$value, c())

ggplot(df, aes(x = class, fill = value)) + 
  geom_bar() +
  facet_grid(~name, switch = "x") +
  scale_x_discrete(expand = c(0.1, 0.4)) +
  scale_fill_manual(values = c("#a04ca4", "#c7bfe6", "#00000000", 
                               "#4d7b9c", "#ea9138", "#e05554")) +
  theme_classic() +
  theme(panel.spacing = unit(0, "points"),
        strip.background = element_blank(),
        strip.placement = "outside")

enter image description here

Allan Cameron
  • 147,086
  • 7
  • 49
  • 87
  • Thanks Allan! I'll give this a shot as soon as I get back home today! I'll let you know. I figured there had to be a ggplot2 solution. – JeniFav Oct 10 '20 at 13:12
  • This worked great. I made some modifications to make the scale more like plot_likert but the bones of it is in your answer. Thanks so much! – JeniFav Oct 10 '20 at 20:26