R中带有直方图的组合/叠加箱线图

时间:2018-09-28 21:31:06

标签: r ggplot2 boxplot

我需要使用ggplot2将箱线图与直方图结合起来。到目前为止,我已经有了这段代码。

library(dplyr)
library(ggplot2)
data(mtcars)

dat <- mtcars %>% dplyr::select(carb, wt) %>%  
  dplyr::group_by(carb) %>% dplyr::mutate(mean_wt = mean(wt), carb_count = n()) 

plot<-ggplot(data=mtcars, aes(x=carb, y=..count..)) +
  geom_histogram(alpha=0.3, position="identity", lwd=0.2,binwidth=1)+
  theme_bw()+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=0.7))+
  geom_text(data=aggregate(mean_wt~carb+carb_count,dat,mean), aes(carb, carb_count+0.5, label=round(mean_wt,1)), color="black")

plot + geom_boxplot(data = mtcars,mapping = aes(x = carb, y = 6*wt,group=carb),
                    color="black", fill="red", alpha=0.2,width=0.1,outlier.shape = NA)+ 
  scale_y_continuous(name = "Count", 
                     sec.axis = sec_axis(~./6, name = "Weight")) 

这导致

enter image description here

但是,我不希望次要y轴的长度与主要y轴的长度相同。我希望次要y轴更小并且仅在右上角。可以说,次要y轴应在主要y轴的20-30之间缩放,而箱形图也应随该y轴缩放。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:3)

这是一种方法,其中我调整了辅助轴公式并调整了其标注方式。 (编辑:根据OP注释进行了调整,以使框线图更大。)

plot + geom_boxplot(data = mtcars,
                    # Adj'd scaling so each 1 wt = 2.5 count
                    aes(x = carb, y = (wt*2.5)+10,group=carb),
                    color="black", fill="red", alpha=0.2,
                    width=0.5, outlier.shape = NA)+  # Wider width
  scale_y_continuous(name = "Count", # Adj'd labels to limit left to 0, 5, 10
                     breaks = 5*0:5, labels = c(5*0:2, rep("", 3)),
                     # Adj'd scaling to match the wt scaling
                     sec.axis = sec_axis(~(.-10)/2.5, name = "Weight", 
                                         breaks = c(0:5))) +
  theme(axis.title.y.left = element_text(hjust = 0.15, vjust = 1),
        axis.title.y.right = element_text(hjust = 0.15, vjust = 1))

enter image description here

您还可以考虑使用patchwork软件包的替代方法,该软件包是由在ggplot2中实现次级量表的同一位开发人员巧合编写的...

# Alternative solution using patchwork
library(patchwork)
plot2 <- ggplot(data=mtcars, aes(x=carb, y=..count..)) +
  theme_bw()+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=0.7))+
  geom_boxplot(data = mtcars,
               aes(x = carb, y = wt, group=carb),
               color="black", fill="red", alpha=0.2,width=0.1,outlier.shape = NA) +
  scale_y_continuous(name = "Weight") +
  scale_x_continuous(labels = NULL, name = NULL,
                     expand = c(0, 0.85), breaks = c(2,4,6,8))

plot2 + plot + plot_layout(nrow = 2, heights = c(1,3)) +
labs(x=NULL)

enter image description here