Многогрупповая частота с ggplot - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь воспроизвести эту гистограмму в R.

Вот как имитировать мой набор данных:

    dft <- data.frame(
  menutype =  sample(c(1,2,4,5,6,8,12), 120, replace = T),
  Belief = sample(c(0,1), 120, replace = T),
  Choice = sample(c(0,1), 120, replace = T)
)

Вот мой код:

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


    df <- data.frame(
  menutype =  factor(df$menutype, labels = c("GUILT" , "SSB0", "SSB1", "FLEX0", "FLEX1", "STD", "FLEX01"),
                     levels = c(1,2,4,5,6,8,12)),
  Belief = factor(df$belieflearn, levels = c(1), labels= c("Believe Learn")), #Interested only in this condition
  Choice = factor(df$learned, levels = c(1), labels= c("Learn")) #Same here
)


    df1 <- rbind(na.omit(df %>%
                           count(Belief, menutype) %>%
                           group_by(menutype) %>% 
                           mutate(prop = n / sum(n))),
                 na.omit(df %>%
                           count(Choice, menutype) %>%
                           group_by(menutype) %>% 
                           mutate(prop = n / sum(n))))



    test <- paste(df1$Belief[1:6],paste(df1$Choice[7:13]))
test[1:6] <- paste(df1$Belief[1:6])
test[7:13] <- paste(df1$Choice[7:13])

df1$combine <- paste(test)

    ggplot(data = df1, aes(menutype, prop, fill = combine)) + 
      labs(title = "Classification based on rank ordering\n", x = "", y = "Fraction of subjects", fill = "\n") +
      geom_bar(stat = "identity", position = "dodge")+
      theme_bw() +
      theme(legend.position="bottom", plot.title = element_text(hjust = 0.5)) #Centering of the main title+
    #geom_text(aes(label="ok"), vjust=-0.3, size=3.5)+

Проблема в том, что он более или менее работает, я почти получаю график , который мне нужен, но это обходной путь, и все еще есть некоторые ошибки. Действительно, у меня, например, такое же значение для STD (0,10), тогда как оно должно быть 0 и 0,10, как на исходном графике.

Я бы хотел оптимально иметь два разных фрейма данных, один с menutype и Belief, другой с menutype и Choice, затем, как и я, вычислим пропорцию конкретной c модальности в каждой последней переменной на menutype и, наконец, построим его в виде гистограмм, примерно столько же, сколько графика в исходном исследовании. Кроме того, я хотел бы иметь пропорции в виде дробей над каждой полоской, но это необязательно.

Может ли кто-нибудь помочь мне в этом вопросе? Я действительно изо всех сил пытаюсь заставить его работать.

Заранее спасибо!

РЕДАКТИРОВАТЬ : Я думаю, что проблема в fill =. Я хотел бы указать для каждого столбца нужную мне переменную (например, fill = df2$Belief & df2$Choice), но я не знаю, как действовать дальше.

1 Ответ

0 голосов
/ 09 мая 2020
library(tidyverse)

set.seed(10)

# example data frame
df <- data.frame(
  menutype =  sample(c(1,2,4,5,6,8,12), 120, replace = T),
  Belief = sample(c(0,1), 120, replace = T),
  Choice = sample(c(0,1), 120, replace = T)
)

# calculate all metrics based on all variables you want to plot in a tidy way
df_plot = df %>%
  group_by(Choice) %>%
  count(menutype, Belief) %>%
  mutate(prop = n / sum(n),
         prop_text = paste0(n, "/", sum(n))) %>%
  ungroup()

# barplots using one variable and split plots using another variable
df_plot %>%
  mutate(Belief = factor(Belief),
         menutype = factor(menutype)) %>%
  ggplot(aes(menutype, prop, fill = Belief))+
  geom_col(position = "dodge")+
  facet_wrap(~Choice, ncol=1)+
  geom_text(aes(label=prop_text), position = position_dodge(1), vjust = -0.5)+
  ylim(0,0.2)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...