-1

A bar plot depicting the differences of answers between 2 surveys from 1-5

I'm new to programming in R studio and am struggling with making a graph for a project. I've attached my current code and a photo of the graph I am trying to produce.

The data in my excel table gives me one count of option "1", in the Q1 initial survey, and 0 counts of option "1" for the follow up survey but for some reason, the graph is grey for Q1 for both sections. Not sure how I can fix this to get rid of the second grey bar and leave that area empty to indicate the lack of "1" votes for the follow up survey. How do i fix this?

library(readxl)
library(tidyverse)
DATA <- read_excel("C:/Users/dsm/OneDrive/Desktop/Poole Research/DATA.xlsx", sheet = "Sheet2")

Newpractice <- dplyr::filter(DATA, Type=="Q1 Follow Up" | Type=="Q1 Initial")


 Newpractice %>%  
  ggplot(aes(x = Score, y = after_stat(count/sum(count)),  fill = Type)) +
  geom_bar(position = "dodge") +
  scale_fill_grey() +
  ylab("Frequency")
Newpractice <-
  structure(list(
    Type = c("Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", "Q1 Initial", 
             "Q1 Initial", "Q1 Initial", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", 
             "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up", "Q1 Follow Up"), 
    Score = c(5, 3, 5, 3, 3, 4, 3, 3, 3, 3, 5, 3, 3, 3, 3, 2, 3, 3, 
              3, 5, 3, 4, 3, 4, 5, 3, 3, 3, 3, 2, 3, 3, 4, 3, 3, 3, 5, 5, 2, 5,
              4, 3, 4, 5, 3, 3, 3, 1, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 2, 3, 4,
              3, 3, 5, 3, 3, 5, 5, 3, 5, 3, 3, 5, 3, 5, 3, 3, 3, 3, 5, 3, 4, 5,
              3, 5, 4, 3, 4, 3, 2, 5, 3, 3, 5, 4, 3, 3, 4, 3, 4, 4, 3, 3, 3, 3,
              5, 3, 3, 3, 3, 3, 3, 3, 5, 3, 4, 3, 4, 3, 5, 3, 3, 3, 3, 3, 3, 4,
              3, 3, 3, 5, 3, 3, 5, 3, 5, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
              3, 3, 3, 3, 5, 3, 4, 3, 5, 3, 5, 3, 5, 3, 3, 3, 3, 3, 3, 4, 5, 3,
              5, 3, 3, 5, 4, 3, 3, 5, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 5, 5, 5,
              5, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 5, 3, 4, 5, 5, 3, 4, 5,
              3, 3, 5, 3, 4, 5, 3, 4, 3, 5, 3, 5, 4, 3, 3, 4, 3, 3, 3, 3, 3, 3,
              3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 3, 3, 3, 4, 4,
              3, 4, 3, 3, 5, 3, 5, 3, 3, 3, 4, 3, 3, 5, 4, 3, 3, 4, 3, 5, 4, 3,
              5, 5, 3, 3, 4, 3, 3, 5, 3, 5, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 5, 3,
              3, 3, 4, 3, 4, 5, 3, 5, 3, 3, 3, 5, 3, 3, 5, 3, 3, 3, 5, 3, 5, 5,
              4, 5, 3, 5, 5, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, 5, 4, 3, 3, 5, 3, 5,
              3, 5, 3, 5, 3, 3, 3, 3, 5, 5, 4, 5, 4, 5, 3, 5, 5, 3, 5, 3, 3, 3,
              5, 3, 3, 5, 3, 4, 5, 5, 2, 4, 4, 3)), 
    row.names = c(NA, -382L ), class = c("tbl_df", "tbl", "data.frame"))
Rui Barradas
  • 70,273
  • 8
  • 34
  • 66
dsm22
  • 13
  • 3
  • Can [this](https://stackoverflow.com/a/37490544/8245406) help? Or, somewhat different, [this one](https://stackoverflow.com/questions/59814092/add-empty-bars-to-a-percentage-barplot-generated-from-long-data-fromat)? In both questions the trick is to coerce to factor with all levels and then plot with `scale_x_discrete(drop = FALSE)`. – Rui Barradas Sep 22 '22 at 21:12
  • Not sure if it did. I'm realizing the problem might have to do with turning numerical data into categorical data? But it still doesn't work. I tried doing scale_x_discrete and adding 1, 2, 3, 4 ,5 as levels but that didn't do anything. I also tried the drop = FALSE and that just gets rid of the 1-5 on the graph. – dsm22 Sep 22 '22 at 22:35
  • Can you post sample data? Please edit the question with the output of `dput(Newpractice)`. Or, if it is too big with the output of `dput(head(Newpractice, 20))`. – Rui Barradas Sep 23 '22 at 04:37
  • Ok, just did it. Not sure if that helps – dsm22 Sep 23 '22 at 16:12

1 Answers1

0

Here is a way.
The frequencies computation is done in the pipe so that the Type is completed with the missing levels, filling them with zeros (only one but it would work for any number of missing levels).
I also use geom_col, not geom_bar, since the values to be plotted are already known.

suppressPackageStartupMessages({
  library(ggplot2)
  library(dplyr)
  library(tidyr)  # complete() and nesting()
})

Newpractice %>%
  mutate(Type = as.factor(Type),
         Score = as.factor(Score)) %>%
  count(Score, Type, name = "Frequency") %>%
  mutate(Frequency = Frequency/sum(Frequency)) %>% 
  complete(Type, nesting(Score), fill = list(Frequency = 0)) %>%
  ggplot(aes(x = Score, y = Frequency,  fill = Type)) +
  geom_col(position = position_dodge()) +
  scale_fill_grey(drop = FALSE) +
  scale_x_discrete(drop = FALSE)

Created on 2022-09-23 with reprex v2.0.2

Rui Barradas
  • 70,273
  • 8
  • 34
  • 66