在ggplot boxplot中绘制多个框?

时间:2019-04-15 10:20:48

标签: r ggplot2 boxplot

对于未使用正确的“行话”表示歉意,我不知道这叫什么:

我有一个表,该表由数据组成,这些数据表示参与者对问题的数字回答。数据表看起来像下面的示例(为清楚起见,明显缩短了):

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

然后我得到了:

enter image description here

但是我从这里去哪里?我以为我可以将额外的列添加到aes的“ y =“部分,如下所示:

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()函数,但我不想使用它,因为我希望我的箱形图和条形图具有相同的样式,而且我不喜欢r中的barplot()函数的工作方式!

2 个答案:

答案 0 :(得分:0)

您将想要做

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

答案 1 :(得分:0)

好的,我已经开始工作了。感谢Robin Gertenbach对他建议我执行以下操作的建议:

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

这创建了一个箱形图,可以给我我想要的东西,但是x轴值不正确(即,它们变为q1, q10, q2, q3, q4....)。我找到了对此here的解决方案,并使用了Tjebo's解决方案。

最后,我的代码如下:

# 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