问题描述
对于下面的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')
输出:
,一种实现此目的的方法是制作两个单独的图并使用例如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