Сгруппированная таблица скрипок с несколькими переменными - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь создать сгруппированную таблицу скрипок с помощью ggplot2, аналогичную этой в галерее R. Без группировки я смог создать сценарий скрипки с отдельными столбцами в качестве категорий, сложив данные. Я скопировал образцы данных и рабочий код, а также результат графика ниже.

Проблема в том, что при наложении я получаю только два столбца, а это значит, что я не могу добавить третий столбец для группировки ( в данном случае пол), поэтому я не могу следовать примеру галереи R.

В основном, я хочу иметь возможность создать такой же график, как показано ниже, но разделив каждый сюжет скрипки на два, один для мужчин и один для женщин. Так, например, вместо участка comfort.trustmainstreammedia , выделенного желтым цветом, будет один участок comfort.trustmainstreammedia над другим comfort.trustmainstreammedia график с цветами соответствует мужской и женский , и всего будет шесть скрипичных сюжетов.

Вот некоторые примерные данные:

structure(list(comfort.trustmainstreammedia = c(100, 96, 100, 
40, 80, 100, 100, 100, 100, 100), comfort.democracybest = c(100, 
94, 100, 92, 80, 100, 45, 70, 100, 100), comfort.capitalismbest = c(100, 
90, 100, 86, 80, 100, 30, 100, 100, 100), gender = c("Male", 
"Female", "Male", "Female", "Male", "Female", "Male", "Male", 
"Male", "Male")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"), .Names = c("comfort.trustmainstreammedia", 
"comfort.democracybest", "comfort.capitalismbest", "gender"))

А вот это мой код для создания графика:

p <- stack(select(mwe, starts_with("comfort.")))
names(p)[names(p) == "values"] <- "value"
names(p)[names(p) == "ind"] <- "text"
p$text = with(p, reorder(text, value, mean))
p <- p %>%
  ggplot( aes(x=text, y=value, fill=text, color=text)) +
  geom_violin(width=1.4, size=0.2, trim=TRUE) +
  scale_fill_viridis(discrete=TRUE) +
  scale_color_viridis(discrete=TRUE) +
  theme(
    legend.position="none"
  ) +
  coord_flip() + # This switch X and Y axis and allows to get the horizontal version
  xlab("Question") +
  ylab("%") +
  title("Comfort")
p + stat_summary(fun=mean, geom="point", shape = 23, size=1, color="black")

... который создает этот график: введите описание изображения здесь

1 Ответ

2 голосов
/ 02 августа 2020

Вместо stack вы можете использовать pivot_longer для подготовки данных. При этом будет сохранен столбец gender, который затем можно будет сопоставить с color и fill. Попробуйте это:

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

d <- mwe %>% 
  tidyr::pivot_longer(-gender, names_to = "text") %>% 
  mutate(text = reorder(text, value, mean))

p <- ggplot(d, aes(x=text, y=value, fill=gender, color=gender)) +
  geom_violin(width=1.4, size=0.2, trim=TRUE) +
  scale_fill_viridis(discrete=TRUE) +
  scale_color_viridis(discrete=TRUE) +
  theme(legend.position="none") +
  coord_flip() + # This switch X and Y axis and allows to get the horizontal version
  xlab("Question") +
  ylab("%") +
  ggtitle("Comfort")

p + stat_summary(fun=mean, geom="point", shape = 23, size=1, color="black")
#> Warning: position_dodge requires non-overlapping x intervals

...