ggplot2中的两面板散点图

问题描述

对于下面的data.frame full,我想知道如何创建一个两面板的geom_point,以便在第一个面板上有ols.(Intercept)(x轴)相对于hlm.(Intercept)绘制,并且在第二个面板上,我们相对于ols.ses绘制了hlm.ses(x轴)?

library(lme4) 
library(tidyverse)

hsb <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/hsb.csv')

fit <- lmer(math~ses+(ses|sch.id),data= hsb)
ch <- unique(hsb$sch.id)

ols <- map_dfr(ch,~coef(lm(math~ses,data=hsb,subset=sch.id==.)))
mlm <- coef(fit)$sch
full <- cbind(ols=ols,hlm=mlm,sch.id=ch)

head(full,n = 1)
     ols.(Intercept)  ols.ses hlm.(Intercept)  hlm.ses sch.id
1224        10.80513 2.508582        11.06002 2.504083   1224

解决方法

带有构面的选项。 @stefan 的解决方案非常好且快捷。您可以通过巧妙地分离字符串来设置整个数据管道,然后在重塑形状之后,以使用facet_wrap()进行绘制的格式获得所需的变量。这里的代码:

library(tidyverse)
#Plot
full %>% select(-sch.id) %>% pivot_longer(everything()) %>%
  separate(name,c('V1','V2'),sep='\\.') %>%
  arrange(V2,V1) %>%
  group_by(V2,V1) %>% mutate(id=row_number()) %>%
  pivot_wider(names_from = V1,values_from=value) %>% ungroup() %>%
  select(-id) %>%
  ggplot(aes(x=ols,y=mlm))+
  geom_point()+
  facet_wrap(.~V2,nrow = 1,scales = 'free')

输出:

enter image description here

,

一种实现此目的的方法是制作两个单独的图并使用例如patchwork

library(lme4) 
library(tidyverse)
library(patchwork)

hsb <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/hsb.csv')

fit <- lmer(math~ses+(ses|sch.id),data= hsb)
ch <- unique(hsb$sch.id)

ols <- map_dfr(ch,~coef(lm(math~ses,data=hsb,subset=sch.id==.)))
mlm <- coef(fit)$sch
full <- cbind(ols=ols,mlm=mlm,sch.id=ch)

p1 <- ggplot(full,aes(`ols.(Intercept)`,`mlm.(Intercept)`)) +
  geom_point()

p2 <- ggplot(full,aes(ols.ses,mlm.ses)) +
  geom_point()

p1 + p2

第二种方法是处理一些数据,一个方法可以使用facet_wrap进行类似的绘制:

library(lme4) 
#> Loading required package: Matrix
library(tidyverse)

hsb <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/hsb.csv')

fit <- lmer(math~ses+(ses|sch.id),sch.id=ch)

full %>% 
  pivot_longer(- sch.id,names_to = "var",values_to = "value") %>% 
  separate(var,into = c("var1","category"),sep = "\\.") %>% 
  pivot_wider(names_from = var1,values_from = value) %>% 
  ggplot(aes(ols,mlm)) +
  geom_point() +
  facet_wrap(~ category)

,

类似于使用patchwork的答案,您可以将它们绘制成两个单独的ggplot()图,然后将它们与{{1}中的plot_grid()函数并排放置}包。

https://cran.r-project.org/web/packages/cowplot/vignettes/introduction.html