假设我想绘制一个包含点和线的图形,其中点出现在每组中相应线的前面。特别是,我希望用红色填充点来绘制第1组,这些点通过一条线连接,但是要用(仅)一条蓝线来绘制第2组,但是我要用第1组来绘制第2组。例如,在基本图形中:
set.seed(101)
dd <- data.frame(x=rep(1:10,2),
y=rep(1:10,2),
f=factor(rep(1:2,each=10)))
dd$y[11:20] <- dd$y[11:20] + rnorm(10)
d1 <- subset(dd,f=="1")
d2 <- subset(dd,f=="2")
par(cex=1.5)
plot(y~x,data=d1,bg="red",pch=21,type="o")
lines(y~x,data=d2,col="blue",lwd=2)
legend("bottomright",c("group 1","group 2"),
col=c("black","blue"),
pch=c(21,NA),
pt.bg=c("red",NA),
lty=1,
lwd=c(1,2))
(我的真实数据要复杂一些。)我在尝试在
ggplot2
中干净地执行此操作有些疯狂。如果我在线条之前画点,则第1组的点会被同一组中的线覆盖:
library(ggplot2); theme_set(theme_bw())
g0 <- ggplot(dd,aes(x,y,fill=f,colour=f,shape=f))+
scale_fill_manual(values=c("red",NA))+
scale_colour_manual(values=c("black","blue")) +
scale_shape_manual(values=c(21,NA))
g0 + geom_point()+ geom_line()
ggsave("order2.png",width=3,height=3)
如果我在点之前画线,则第2组的线会被第1组的点覆盖:
g0 + geom_line()+ geom_point()
ggsave("order3.png",width=3,height=3)
所需的顺序是(第1组线),(第1组点),(第2组线)。我可以通过再次手动覆盖几何体来做到这一点,一次一组,但这很丑陋。
g0 + geom_line() + geom_point()+
geom_point(data=d1)+
geom_line(data=d2,show.legend=FALSE)
ggsave("order4.png",width=3,height=3)
我认为对此的“最佳”解决方案是编写一个可以按需工作的低层
geom_linepoint
。我研究了一下,它是not entirely trivial ...谁能提出更清洁,更简单的解决方案?最佳答案
这是“低技术含量” 1解决方案。下面是为给定分组变量的每个级别依次添加线层和点层的函数。
linepoint = function(data, group.var, lsize=1.2, psize=4) {
lapply(split(data, data[,group.var]), function(dg) {
list(geom_line(data=dg, size=lsize),
geom_point(data=dg, size=psize))
})
}
ggplot(dd, aes(x,y, fill=f, colour=f,shape=f))+
scale_fill_manual(values=c("red",NA))+
scale_colour_manual(values=c("black","blue")) +
scale_shape_manual(values=c(21,NA)) +
linepoint(dd, "f")
1“低技术含量”与编写新的几何图形相比。 @baptiste(现在已删除)的答案确实创建了一个新的几何图形,似乎已经完成了工作,因此我不确定他为什么删除了它。
关于r - 每个组/ggplot2等价于类型=“o”的线前的绘图点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42983499/