繁体   English   中英

ggplot2 中的两面板散点图

[英]two-panel scatter plot in ggplot2

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

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

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()图,然后将它们与cowplot包中的plot_grid()函数cowplot

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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