使用facet_wrap和ggplot2在每个小面板中绘制整个数据。

8

我正在尝试为每个数据集绘制线图和facet_wrap。我希望在背景中以浅灰色、透明或其他方式显示所有数据集。

df <- data.frame(id=rep(letters[1:5], each=10),
                 x=seq(10),
                 y=runif(50))

ggplot(df, aes(x,y, group=id)) + 
  geom_line() + 
  facet_wrap(~ id)

enter image description here

这张图是我所得到的,但我希望在每个图中都有另外缺失的四条线... 无论我如何使用 facet_wrap,我都只得到单条线的数据。

我期望的是每个小图都有如下的展示。

ggplot(df, aes(x,y, group=id)) + 
  geom_line() + 
  geom_line(data=df[1:10,], aes(x,y, group=id), size=5)

enter image description here

2个回答

14

这里有另一种方法:

首先添加一个与id相同的新列:

df$id2 <- df$id

然后根据没有原始 id 列的数据框添加另一个 geom_line

ggplot(df, aes(x,y, group=id)) + 
  geom_line(data=df[,2:4], aes(x=x, y=y, group=id2), colour="grey") +
  geom_line() + 
  facet_wrap(~ id)

enter image description here


太棒了!我真的没有想过可以用这种方式向几何图形添加新数据,而是试图在一行中添加所有观测信息。 - Heroka
我也比起@Heroka更喜欢这个解决方案。我还需要想一会儿为什么它能很好地工作,但我认为这可以轻松解决我的问题... - drmariod
谢谢 :) 虽然我相信在这里有很多同样有创意的方法可以工作。 - erc

3

这里有一种方法。对于较大的数据集可能不太适用,因为我们需要将数据复制number_of_facets次。

首先,我们进行一些数据整理以创建所需的数据框。 df$obs_id <- 1:nrow(df) #为每个观察值分配唯一ID

#new data with unique ID's and 'true' facets
df2 <- expand.grid(true_facet=unique(df$id), obs_id=1:nrow(df))

#merge them
dat <- merge(df,df2,by="obs_id",all=T)

然后,我们创建一个标志来定义“真实”的多面变量,并区分背景和前景。

dat$col_flag <- dat$true_facet == dat$id

现在,绘制变得容易了。我使用了两次geom_line而不是scales,因为这比尝试修复排序更容易(会导致黑色在灰色下面绘制)。
p1 <- ggplot(dat, aes(x=x,y=y, group=id))+
  geom_line(color="grey")+
  geom_line(dat=dat[dat$col_flag,],size=2,color="black")+
  facet_wrap(~true_facet)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接