将相应的盒子并排放置在箱图中

时间:2019-03-05 17:11:48

标签: r boxplot

我在演讲中会说一些单词。我想比较最终排名中相同单词的持续时间和最终排名中相同单词的持续时间。以下是一些可重现的数据:

df <- data.frame(
  word1 = c(sample(LETTERS[1:5], 10, replace = T)),
  word2 = c(sample(LETTERS[1:5], 10, replace = T)),
  word3 = c(sample(LETTERS[1:5], 10, replace = T)),
  word4 = c(sample(LETTERS[1:5], 10, replace = T)),
  word5 = c(sample(LETTERS[1:5], 10, replace = T)),
  dur1 = c(round(abs(rnorm(10)),2)),
  dur2 = c(round(abs(rnorm(10)),2)),
  dur3 = c(round(abs(rnorm(10)),2)),
  dur4 = c(round(abs(rnorm(10)),2)),
  dur5 = c(round(abs(rnorm(10)),2))
)
df
# convert words to character:
df[,1:5] <- lapply(df[,1:5], as.character)

此数据中的最终排名包含df[,1:4],而最终排名仅包含df$word5。现在,我还有一组目标词,它们的持续时间在两种情况下都希望在箱图中绘制:

targets <- c("A", "C", "E")

我很难回答的问题是如何在箱图中并列绘制任一条件下目标的持续时间。到目前为止,我尝试过的是: 我将预targets中包含的词放在单个向量中:

word1to4 <- c(df$word1[df$word1 %in% targets], df$word2[df$word2 %in% targets], df$word3[df$word3 %in% targets],
          df$word4[df$word4 %in% targets])

并将其持续时间合并到另一个向量中:

dur1to4 <- c(df$dur1[df$word1 %in% targets], df$dur2[df$word2 %in% targets], df$dur3[df$word3 %in% targets],
         df$dur4[df$word4 %in% targets])

对单词和最终位置中的单词持续时间做同样的事情:

word5 <- df$word5[df$word5 %in% targets]
dur5 <- df$dur5[df$word5 %in% targets]

现在,我可以绘制预决赛和决赛单词的持续时间,但不幸的是,只能在两个不同的方框图中:

par(mfrow=c(1,2))
boxplot(dur1to4 ~ word1to4, main="Words 1-4", col="red", frame=F)
boxplot(dur5 ~ word5, main="Word 5", col="blue", frame=F)

enter image description here 我宁愿在单个箱线图中并排放置目标词的持续时间。如何实现?

2 个答案:

答案 0 :(得分:2)

如果您打算在R中生成大量图表,可能值得您花时间学习使用ggplot(ggplot2)软件包。尽管学习曲线有些许变化,但它要灵活得多,使您可以创建外观非常专业的图形。

这是使用ggplot的解决方案。

df <- data.frame(
    word1 = c(sample(LETTERS[1:5], 10, replace = T)),
    word2 = c(sample(LETTERS[1:5], 10, replace = T)),
    word3 = c(sample(LETTERS[1:5], 10, replace = T)),
    word4 = c(sample(LETTERS[1:5], 10, replace = T)),
    word5 = c(sample(LETTERS[1:5], 10, replace = T)),
    dur1 = c(round(abs(rnorm(10)),2)),
    dur2 = c(round(abs(rnorm(10)),2)),
    dur3 = c(round(abs(rnorm(10)),2)),
    dur4 = c(round(abs(rnorm(10)),2)),
    dur5 = c(round(abs(rnorm(10)),2))
)
df
# convert words to character:
df[,1:5] <- lapply(df[,1:5], as.character)
targets <- c("A", "C", "E")
word1to4 <- c(df$word1[df$word1 %in% targets], df$word2[df$word2 %in% targets], df$word3[df$word3 %in% targets],
              df$word4[df$word4 %in% targets])
dur1to4 <- c(df$dur1[df$word1 %in% targets], df$dur2[df$word2 %in% targets], df$dur3[df$word3 %in% targets],
             df$dur4[df$word4 %in% targets])

word5 <- df$word5[df$word5 %in% targets]
dur5 <- df$dur5[df$word5 %in% targets]

# Create Dataset to plot
library(ggplot2)

box_data<-data.frame(words=c(word1to4,word5),dur=c(dur1to4,dur5),
                     type=c(rep("1 to 4",length(word1to4)),rep("5",length(word5))))

box_data$type<-as.factor(box_data$type)
box_data$x<-interaction(box_data$words, box_data$type)

box_data$xc<-as.character(box_data$x)
box_data<-box_data[order(box_data$xc),]
box_data
my_boxplot<-ggplot(box_data, aes(x=xc, y=dur)) + geom_boxplot(aes(fill=type)) +
theme(legend.position = "top", legend.title = element_blank(), plot.title = element_text(hjust = 0.5)) +
ggtitle("Duration By Word and Type")

my_boxplot

enter image description here

答案 1 :(得分:1)

解决此问题的一种方法是创建另一个向量,该向量指示单词所属的分组,然后使用箱图中的公式表达式对结果进行正确分组。在下面,我创建了一个数据框来保存所有数据并从中绘制。

#Create data frames to hold the data
out<-data.frame(group="word1to4", word=word1to4, duration=dur1to4)
out5<-data.frame(group="word 5", word=word5, duration=dur5)
#Data frame with all of the data
answer<-rbind(out, out5)

#plotting grouping by Word groups and word, add a legend
par(mfrow=c(1,1))
boxplot(answer$duration ~ answer$group +answer$word, main="Words", col=c("red", "blue"), frame=F, las=2)
legend("top",legend=c("Words1-4", "Word5"),  fill=c("red", "blue"))

enter image description here