简体   繁体   中英

How to place multiple boxplots in the same column with ggplot(geom_boxplot)

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

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")

在此处输入图片说明

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="")

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM