我正在尝试生成一个多层图,其中一个图层中的点仅显示在使用来自另一个图层的数据创建的面的一小部分中。在下面的代码中,红色的点是x1
或x2
(就像构面的行标签一样)。
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
来生成黑色方块。的 /修改
但我真正想要的是仅显示第一行方面df2
中df2$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
并且将图形拼凑在一起非常耗时。
答案 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
不是100%确定我能抓住你的问题......