Reputation: 321
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!
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")
Upvotes: 0
Views: 597
Reputation: 123783
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)
Upvotes: 1