How to place multiple boxplots in the same column

2019-09-11 02:11发布

I would like to built a boxplot in which the 4 factors (N1:N4) are overlaid in the same column. For example with the following data:

df<-data.frame(N=N,Value=Value)
Q<-c("C1","C1","C2","C3","C3","C1","C1","C2","C2","C3","C3","Q1","Q1","Q1","Q1","Q3","Q3","Q4","Q4","Q1","Q1","Q1","Q1","Q3","Q3","Q4","Q4")
N<-c("N2","N3","N3","N2","N3","N2","N3","N2","N3","N2","N3","N0","N1","N2","N3","N1","N3","N0","N1","N0","N1","N2","N3","N1","N3","N0","N1")
Value<-c(4.7,8.61,8.34,5.89,8.36,1.76,2.4,5.01,2.12,1.88,3.01,2.4,7.28,4.34,5.39,11.61,10.14,3.02,9.45,8.8,7.4,6.93,8.44,7.37,7.81,6.74,8.5)

with the following (usual) code, the output is 4 box-plots displayed in 4 columns for the 4 variables

ggplot(df, aes(x=N, y=Value,color=N)) +  theme_bw(base_size = 20)+ geom_boxplot()

many thanks

标签: r ggplot2
1条回答
戒情不戒烟
2楼-- · 2019-09-11 02:31

Updated Answer

Based on your comment, here's a way to add marginal boxplots. We'll use the built-in mtcars data frame.

First, some set-up:

library(cowplot)

# Common theme elements
thm = list(theme_bw(), 
           guides(colour=FALSE, fill=FALSE),
           theme(plot.margin=unit(rep(0,4),"lines")))

Now, create the three plots:

# Main plot
p1 = ggplot(mtcars, aes(wt, mpg, colour=factor(cyl), fill=factor(cyl))) +
  geom_smooth(method="lm") + labs(colour="Cyl", fill="Cyl") +
  scale_y_continuous(limits=c(10,35)) +
  thm[-2] +
  theme(legend.position = c(0.85,0.8)) 

# Top margin plot
p2 = ggplot(mtcars, aes(factor(cyl), wt, colour=factor(cyl))) +
  geom_boxplot() + thm + coord_flip() + labs(x="Cyl", y="")

# Right margin plot
p3 = ggplot(mtcars, aes(factor(cyl), mpg, colour=factor(cyl))) +
  geom_boxplot() + thm + labs(x="Cyl", y="") +
  scale_y_continuous(limits=c(10,35))

Lay out the plots and add the legend:

plot_grid(plotlist=list(p2, ggplot(), p1, p3), ncol=2, 
          rel_widths=c(5,1), rel_heights=c(1,5), align="hv")

enter image description here

Original Answer

You can overlay all four boxplots in a single column, but the plot will be unreadable. The first example below removes N as the x coordinate, but keeps N as the colour aesthetic. This results in the four levels of N being plotted at a single tick mark (which I've removed by setting breaks to NULL). However, the plots are still dodged. To plot them one on top of the other, set the dodge width to zero, as I've done in the second example. However, the plots are not readable when they are overlaid.

ggplot(df, aes(x="", y=Value,color=N)) + 
  theme_bw(base_size = 20) + 
  geom_boxplot() +
  scale_x_discrete(breaks=NULL) +
  labs(x="")

ggplot(df, aes(x="", y=Value,color=N)) + 
  theme_bw(base_size = 20) + 
  geom_boxplot(position=position_dodge(0)) +
  scale_x_discrete(breaks=NULL) +
  labs(x="")

enter image description here

查看更多
登录 后发表回答