在多层图的构面中显示要素的子集

时间:2016-12-20 01:11:21

标签: r ggplot2 subset facet

我正在尝试生成一个多层图,其中一个图层中的点仅显示在使用来自另一个图层的数据创建的面的一小部分中。在下面的代码中,红色的点是x1x2(就像构面的行标签一样)。

library(ggplot2)

set.seed(1000)

#generate first df
df1 = data.frame(x=rep(rep(seq(2,8,2),4),4), 
                 y=rep(rep(seq(2,8,2),each=4),4),
                 v1=rep(c("x1","x2"),each=32),
                 v2=rep(rep(c("t1","t2"),each=16),2),
                 v3=rbinom(64,1,0.5)) 

# generate second df
df2 = data.frame(x=runif(20)*10,
                 y=runif(20)*10,
                 v4=sample(c("x1","x2"),20,T))

# create theme
t1=theme(panel.grid.major = element_blank(), text = element_text(size=18),
         panel.grid.minor = element_blank(), strip.background= element_blank(),
         axis.title.x = element_blank(), axis.title.y = element_blank())

# plot
ggplot() + 
  geom_point(data=df1, aes(x=x, y=y, colour = factor(v3)), shape=15,  size=5) + 
  scale_colour_manual(values = c(NA,"black")) + facet_grid(v1~v2) +
  geom_point(data=df2, aes(x=x,y=y, shape=v4), colour="red", size=4) + 
  coord_equal(ratio=1) + xlim(0, 10) + ylim(0, 10) + t1

编辑:通过手动将df1$v3 = 1的颜色设置为black并将df1$v3 = 0设置为NA来生成黑色方块。的 /修改

但我真正想要的是仅显示第一行方面df2df2$v4 = x1的点和第二行方面df2$v4 = x2中的点(对应于值df1$v1和facet的行标签。

我通过生成两个单独的图表来完成这个......

ggplot() + 
  geom_point(data=df1[df1$v1=="x1",], shape=15,  size=5, 
  aes(x=x, y=y, colour = factor(v3)), ) + 
  scale_colour_manual(values = c(NA,"black")) + facet_grid(~v2) +
  geom_point(data=df2[df2$v4=="x1",], aes(x=x,y=y), colour="red", size=4) + 
  coord_equal(ratio=1) + xlim(0, 10) + ylim(0, 10) + t1

ggplot() + 
  geom_point(data=df1[df1$v1=="x2",], shape=15,  size=5, 
  aes(x=x, y=y, colour = factor(v3)), ) + 
  scale_colour_manual(values = c(NA,"black")) + facet_grid(~v2) +
  geom_point(data=df2[df2$v4=="x2",], aes(x=x,y=y), colour="red", size=4) + 
  coord_equal(ratio=1) + xlim(0, 10) + ylim(0, 10) + t1

...但我很好奇是否可以生成单个绘图,因为我的实际数据集中有几个x's并且将图形拼凑在一起非常耗时。

1 个答案:

答案 0 :(得分:4)

如果我们只是重命名df2$v4或创建一个名为df2$v1的新列,这有助于进行分区:

df2 <- dplyr::rename(df2, v1 = v4)
df2$v1 <- df2$v4
# either works

然后ggplot将按照您的意愿分发数据点:

ggplot() + 
    geom_point(data=df1, aes(x=x, y=y, colour = factor(v3)), shape=15,  size=5) + 
    scale_colour_manual(values = c(NA,"black")) +
    facet_grid(v1~v2) +
    geom_point(data=df2, aes(x=x,y=y), colour="red", size=4) + 
    coord_equal(ratio=1) + xlim(0, 10) + ylim(0, 10) + 
    t1

enter image description here

不是100%确定我能抓住你的问题......

相关问题