0

I am trying to visually compare the means of some variables using a dot plot. I am specifically looking for a ggplot solution, but my results so far are rather limited. Maybe someone here can help me.

I want to end with 3 dotplots in one grafic. Each dotplot shall consist of one horizontal line capturing 6 variables. Below you can see my code and data. Thank you a lot!

enter image description here

MD5 <- MD4
MD5 <- lapply(MD5, as.numeric)
MD5 <- data.frame(MD5)

MD5[MD5 == 1] <- (-2)
MD5[MD5 == 2] <- (-1)
MD5[MD5 == 3] <- (0)
MD5[MD5 == 4] <- 1
MD5[MD5 == 5] <- 2
MD5[MD5 == 6] <- NA


MD6 <- lapply(MD5[1:17], mean, na.rm = TRUE)
MD6 <- data.frame(MD5)

subset(pivot_longer(MD7[1:6], 1:6), !is.na(value)) %>%
  ggplot(aes(x = value, fill = name)) +
  geom_dotplot() +
  scale_colour_viridis_d(aesthetics = "fill") +
  theme_light()+
  labs(x = "", y ="", fill = 'Verbesserung im Bezug auf:')

structure(list(veränderung_imap_austausch.verstärkt.akteuren = structure(c(3L, 
4L, NA, NA, 3L, 4L, 4L, 3L, NA, NA, NA, NA, NA, NA, NA, 3L, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 5L, NA, 4L, NA, NA, NA, NA, NA, 5L, 4L, NA, NA, NA, 4L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 5L, 3L, 4L, NA, NA, NA, 4L, 4L, 
NA, 1L, 4L, NA, 3L, 4L, 3L, NA, NA, NA, 5L, 5L, 3L, NA, NA, NA, 
5L, NA, 1L, 4L, NA, 4L, NA, 4L, 4L, 4L, 3L, 3L, 3L, NA, 3L, 6L, 
2L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_austausch.verstärkt.ideen = structure(c(5L, 
4L, NA, NA, 3L, 4L, 4L, 2L, NA, NA, NA, NA, NA, NA, NA, 4L, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 5L, NA, 4L, NA, NA, NA, NA, NA, 4L, 4L, NA, NA, NA, 4L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 5L, 4L, 5L, NA, NA, NA, 4L, 4L, 
NA, 3L, 4L, NA, 2L, 4L, 4L, NA, NA, NA, 5L, 5L, 3L, NA, NA, NA, 
5L, NA, 4L, 4L, NA, 4L, NA, 3L, 5L, 4L, 3L, 4L, 4L, NA, 4L, 6L, 
3L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_fortschritt.umsetzung = structure(c(4L, 
4L, NA, NA, 3L, 4L, 6L, 3L, NA, NA, NA, NA, NA, NA, NA, 4L, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 4L, NA, 4L, NA, NA, NA, NA, NA, 5L, 3L, NA, NA, NA, 4L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 4L, 3L, 4L, NA, NA, NA, 4L, 4L, 
NA, 3L, 4L, NA, 3L, 3L, 4L, NA, NA, NA, 5L, 5L, 3L, NA, NA, NA, 
5L, NA, 3L, 3L, NA, 4L, NA, 3L, 5L, 3L, 4L, 2L, 3L, NA, 3L, 6L, 
3L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_neue.strukturen = structure(c(4L, 
4L, NA, NA, 3L, 4L, 4L, 3L, NA, NA, NA, NA, NA, NA, NA, 3L, NA, 
NA, NA, NA, NA, 3L, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 3L, NA, 4L, NA, NA, NA, NA, NA, 5L, 3L, NA, NA, NA, 4L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 4L, 4L, 3L, NA, NA, NA, 4L, 4L, 
NA, 3L, 4L, NA, 3L, 4L, 4L, NA, NA, NA, 5L, 4L, 3L, NA, NA, NA, 
5L, NA, 5L, 3L, NA, 5L, NA, 3L, 5L, 3L, 2L, 2L, 2L, NA, 2L, 6L, 
1L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_zuständigkeiten.klarer = structure(c(3L, 
3L, NA, NA, 3L, 4L, 6L, 3L, NA, NA, NA, NA, NA, NA, NA, 2L, NA, 
NA, NA, NA, NA, 3L, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 3L, NA, 4L, NA, NA, NA, NA, NA, 3L, 3L, NA, NA, NA, 3L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 3L, 3L, 4L, NA, NA, NA, 3L, 3L, 
NA, 4L, 3L, NA, 3L, 3L, 4L, NA, NA, NA, 5L, 4L, 3L, NA, NA, NA, 
5L, NA, 2L, 4L, NA, 3L, NA, 3L, 3L, 3L, 3L, 2L, 2L, NA, 4L, 6L, 
2L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_rollen.klarer = structure(c(3L, 
3L, NA, NA, 3L, 4L, 6L, 2L, NA, NA, NA, NA, NA, NA, NA, 3L, NA, 
NA, NA, NA, NA, 3L, NA, NA, NA, NA, 2L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 4L, NA, 4L, NA, NA, NA, NA, NA, 3L, 1L, NA, NA, NA, 3L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 3L, 3L, 1L, NA, NA, NA, 4L, 3L, 
NA, 4L, 1L, NA, 3L, 4L, 4L, NA, NA, NA, 5L, 4L, 3L, NA, NA, NA, 
5L, NA, 2L, 3L, NA, 3L, NA, 3L, 4L, 3L, 2L, 3L, 3L, NA, 4L, 6L, 
4L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_digitale.lösungen = structure(c(4L, 
4L, NA, NA, 5L, 4L, 4L, 4L, NA, NA, NA, NA, NA, NA, NA, 3L, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, 6L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, 5L, NA, 4L, NA, NA, NA, NA, NA, 5L, 4L, NA, NA, NA, 4L, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, 1L, 3L, 4L, NA, NA, NA, 5L, 5L, 
NA, 6L, 5L, NA, 4L, 4L, 4L, NA, NA, NA, 4L, 5L, 6L, NA, NA, NA, 
4L, NA, 1L, 5L, NA, 4L, NA, 4L, 5L, 5L, 4L, 4L, 4L, NA, 4L, 6L, 
4L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_klarheit.prozesse = structure(c(5L, 
3L, NA, NA, 4L, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, 
NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 5L, NA, NA, 5L, 5L, 3L, 4L, 4L, NA, 3L, 6L, 
4L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_weiterent.planung = structure(c(5L, 
3L, NA, NA, 3L, NA, NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, 
NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 4L, NA, NA, 4L, 5L, 3L, 4L, 4L, NA, 3L, 6L, 
4L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_arbeit.relfelktieren = structure(c(4L, 
3L, NA, NA, 4L, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, 
NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 4L, NA, NA, 3L, 5L, 3L, 4L, 4L, NA, 4L, 6L, 
4L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_veranstaltung.ergebnisorientiert = structure(c(6L, 
4L, NA, NA, 5L, NA, NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, 
NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 5L, NA, NA, 5L, 5L, 3L, 3L, 3L, NA, 6L, 6L, 
3L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_motivation = structure(c(5L, 4L, 
NA, NA, 5L, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, NA, 
4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 5L, NA, NA, 5L, 5L, 4L, 4L, 4L, NA, 3L, 6L, 4L
), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_salienz = structure(c(3L, 4L, NA, 
NA, 5L, NA, NA, 2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, 2L, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, 3L, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 4L, NA, NA, 3L, 4L, 4L, 4L, 3L, NA, 4L, 6L, 3L), .Label = c("Stimme nicht zu", 
"Stimme eher nicht zu", "Stimme teilweise zu", "Stimme zu", "Stimme voll zu", 
"k. A."), class = c("ordered", "factor")), veränderung_imap_interkult.öffnung = structure(c(3L, 
4L, NA, NA, 3L, NA, NA, 2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 2L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, 
NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 4L, NA, NA, 3L, 4L, 3L, 3L, 6L, NA, 3L, 6L, 
2L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_austausch.kommunen.verstärkt = structure(c(4L, 
4L, NA, NA, 4L, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 2L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 5L, NA, NA, NA, NA, NA, 
NA, 6L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 3L, NA, NA, 4L, 2L, 3L, 2L, 6L, NA, 2L, 6L, 
4L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_einarbeitung = structure(c(3L, 3L, 
NA, NA, 5L, NA, NA, 2L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 4L, NA, NA, NA, NA, NA, NA, 
6L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 4L, NA, NA, 4L, 1L, 1L, 2L, 1L, NA, 6L, 6L, 4L
), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor")), veränderung_imap_einsatz.vielfalt.verstärkt = structure(c(3L, 
4L, NA, NA, 3L, NA, NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3L, NA, NA, NA, NA, NA, 
NA, 6L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, 3L, NA, NA, 4L, 3L, 3L, 2L, 3L, NA, 6L, 6L, 
2L), .Label = c("Stimme nicht zu", "Stimme eher nicht zu", "Stimme teilweise zu", 
"Stimme zu", "Stimme voll zu", "k. A."), class = c("ordered", 
"factor"))), row.names = c(NA, -114L), class = "data.frame")

1 Answer 1

1

In my opinion geom_dotplot is not suited for the kind of dot plot you want to achieve as geom_dotplot is a kind of histogram. Instead you could achieve your desired result using geom_point + geom_hline to add the horizontal lines.

To this end I simplified your data wrangling a bit and added a new group variable to split your variables or survey questions in three groups:

library(tidyr)
library(ggplot2)
library(dplyr)

MD4_long <- MD4 %>%
  pivot_longer(everything())  %>%
  mutate(value = as.numeric(value) - 3,
         value = ifelse(value == 3, NA, value)) %>%
  group_by(name) %>%
  summarise(value = mean(value, na.rm = TRUE)) %>% 
  mutate(group = rep(1:3, each = 6)[-nrow(.)])

ggplot(MD4_long, aes(x = value, y = group, color = name)) +
  geom_hline(yintercept = 1:3) +
  geom_point(size = 3) +
  scale_color_viridis_d() +
  theme_light() +
  labs(x = NULL, y = NULL, color = "Verbesserung im Bezug auf:")

However, in my opinion the resulting plot is a bit complicated to read and understand. As an alternative I would suggest a dot plot where you put the questions on the y axis and e.g. order by the mean:

ggplot(MD4_long, aes(x = value, y = reorder(name, value))) +
  geom_point(size = 3) +
  scale_y_discrete(labels = ~gsub("^.*_", "", .x)) +
  theme_light() +
  labs(x = NULL, y = NULL)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.