Разрабатываете более одного бокса в боксе ggplot? - PullRequest
1 голос
/ 15 апреля 2019

Извиняюсь за то, что не использовал правильный "жаргон", я не знаю, как он называется:

У меня есть таблица, составленная из данных, которые представляют числовые ответы участников на вопросы. Таблица данных выглядит как образец ниже (очевидно, сокращенный для ясности):

participant q1 q2 q3 q4 .... q10
     1       2  1 3   5 ....  2
     2       3  2 4   1 ....  4
     3       1  2 4   2 ....  3
     .
     .
     50      2  3 5   2 ....  5

Итак, я хочу создать в ggplot коробочную диаграмму, которая помещает номер вопроса вдоль оси x и оценивает сторону. Я знаю, как сделать коробку с одним вопросом, но как я могу сделать это для всех десяти?

Если я сделаю это:

susQBoxPlot <-ggplot(susQuestions, aes(x = participant, y = q1, group = 1)) 
+ geom_boxplot()
susQBoxPlot

Тогда я получаю это:

* +1012 *enter image description here

Но куда мне идти отсюда? Я подумал, что могу просто добавить дополнительные столбцы к части "y =" aes, например так:

susQBoxPlot <-ggplot(susQuestions, aes(x = participant, y = q1, q2, group = 1)) 
+ geom_boxplot()

Но это просто дает мне тот же вывод.

Далее я попробовал это:

susQBoxPlot <-ggplot(susQuestions, aes(x = participant, y = c(q1, q2), group = 1)) 
+ geom_boxplot()
susQBoxPlot

Но я просто получаю следующую ошибку:

Error: Aesthetics must be either length 1 or the same as the data (50): y

Что бы это ни значило!

Я пытался просмотреть документацию ggplot, но не вижу ничего, что даже отдаленно похоже на то, что я пытаюсь сделать.

И да, я знаю, что r имеет встроенную функцию boxplot (), но я не хочу использовать это, потому что я хочу, чтобы мои прямоугольники и линейчатые диаграммы имели одинаковый стиль, и мне не нравится как работает функция barplot () в r!

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Хорошо, у меня это работает. Спасибо Робину Гертенбаху за его предложение сделать следующее:

ggplot(tidyr::gather(susQuestions, q, val, -participant), aes(q, val, group=q)) + geom_boxplot()

Это создало коробочную диаграмму, которая дала мне то, что я хотел, но значения по оси X были не в порядке (то есть они пошли q1, q10, q2, q3, q4....). Я нашел решение для этого здесь и использовал решение Тьебо .

В конце мой код выглядел так:

# Re-organise susQuestions data frame into long format:
questionData <- tidyr::gather(susQuestions, q, val, -participant)

# Create a vector of question levels
questionLevels <- c("q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10")

# Create box plot
susQBoxPlot <-ggplot(questionData, aes(x = factor(q, questionLevels), val, group=q)) + # Define data for plot
  stat_boxplot(geom ='errorbar', width=0.25) + # Add error bars
  geom_boxplot(fill = "red", colour = "black") + # Set fill colour to blue
  scale_y_continuous(name = "SUS Score", breaks = seq(1, 5, 1), limits=c(1, 5)) + # Set scale for y axis
  scale_x_discrete(name = "Question") + # Set x axis name
  ggtitle("Boxplot of SUS Question Responses") + # Set plot title
  theme_bw() + # Set black and white theme
  theme(plot.title = element_text(hjust = 0.5), # Centre plot title
        panel.grid.major = element_blank(), # Turn off major gridlines
        panel.grid.minor = element_blank()) # Turn off minor gridlines
susQBoxPlot # Display plot

Результат:

enter image description here

0 голосов
/ 15 апреля 2019

Вы захотите сделать что-то вроде

ggplot(tidyr::gather(susQuestions, q, val, -participant), aes(q, val, group=q)) + geom_boxplot()
...