ggplot2 ::在所有面板中使用相同参考图的构面图

时间:2018-01-26 15:03:35

标签: r ggplot2 facet

我想面对一个情节,但每个面板都有一个参考图。让我尝试用图片展示我想要实现的目标:我的示例data_frame:

require(dplyr)

df <- data_frame( id = c(rep('ctr',40), rep('pat',80)),
                  class = c(rep('ctr',40), rep(c('a','b'), each = 40)),
                  rank =  rep (1:20,6),
                  mean = c(rep(seq(3,-3, length.out = 20),2), 
                           rep(seq(1,-4, length.out = 20),2), 
                           rep(seq(-2,-8, length.out = 20),2)),
                  sd = rep(seq(1.2,0.8, length.out = 20), times = 6),
                  exam = rep(c('blue','red'), each = 20, times = 3))

我的情节:

# first, create reference plot of the 'controls'
require(ggplot2)
p_ctr <- ggplot() + 
 geom_line(data = filter(df, id == 'ctr'),
            aes(x=rank, y=mean, color=exam), linetype=1) + 
  geom_ribbon(data = filter(df, id == 'ctr'),
              aes(x = rank, ymax = mean+sd, ymin = mean-sd, 
                  fill = exam), alpha = .1) +
  scale_colour_manual(values = c("#00b6eb","#eb0041")) + 
  scale_fill_manual(values = c("#00b6eb","#eb0041")) 

# then, overlay with plot of 'patients'

p_ctr + geom_line(data = filter(df, id == 'pat'), 
              aes(x=rank, y=mean, linetype = class)) +
  geom_ribbon(data = filter(df, id == 'pat'), 
              aes(x = rank, ymax = mean+sd, ymin = mean-sd,
                  group = class), 
              alpha = .1) +
  facet_wrap(~exam)

就在那里: enter image description here 然而,理想情况下,我想绘制不同的&#34;类&#34;在单独的面板中,但控制图作为每个面板中的参考:

预期结果**Expected result**

我尝试了不同的刻面组合,没有很好的结果。我想,必须有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:2)

也许是这样。

library(dplyr)
library(ggplot2)

df1 <- filter(df, id == 'ctr')
df2 <- filter(df, id == 'pat')
df2 <- dplyr::rename(df2, class_2 = class)

p_ctr <- ggplot() + 
 geom_line(data = df1, aes(x=rank, y=mean, color=exam)) +
 geom_ribbon(data = df1,
             aes(x = rank, ymax = mean+sd, ymin = mean-sd, fill = exam),
             alpha = .1) +
 scale_colour_manual(values = c("#00b6eb","#eb0041")) +
 scale_fill_manual(values = c("#00b6eb","#eb0041")) +
 geom_line(data = df2,
           aes(x=rank, y=mean)) +
 geom_ribbon(data = df2,
             aes(x = rank, ymax = mean+sd, ymin = mean-sd),
             alpha = .1) +
 facet_grid(class_2 ~ exam)

p_ctr

enter image description here

使用facet_wrap会出现以下错误:

  gList中的

错误(列表(x = 0.5,y = 0.5,宽度= 1,高度= 1,只是=&#34;中心&#34;,:     只有&#39; grobs&#39;允许进入&#34; gList&#34;

您在寻找解决方案时可能会遇到此情节。

p_ctr + geom_line(data = filter(df, id == 'pat'), 
                  aes(x=rank, y=mean)) +
        geom_ribbon(data = filter(df, id == 'pat'), 
                    aes(x = rank, ymax = mean+sd, ymin = mean-sd), 
                    alpha = .1) +
      # facet_wrap(~exam) +
        facet_grid(class ~ exam)

enter image description here

这基本上是您的参考图及其叠加层,没有linetypegroup参数。另外,我class ~ exam分面。从这个图中你可以看到问题&#39;是class包含三个独特元素:abctr。这就是为什么我将class中的变量df2重命名为class_2,其中只有两个唯一元素:ab。然后按class_2 ~ exam分区可以得到所需的输出。

我希望这会有所帮助。