Объединить / наложить блокпост с гистограммой в R - PullRequest
0 голосов
/ 29 сентября 2018

Мне нужно объединить блок-график с гистограммой, используя 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 должна масштабироваться между 20-30 первичной оси y, а прямоугольник также должен масштабироваться вместе с осью.

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 29 сентября 2018

Вот один из подходов, в котором я скорректировал формулу вторичной оси и изменил способ ее обозначения.(РЕДАКТИРОВАТЬ: откорректировано, чтобы увеличить рамки для каждого комментария ОП.)

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

...