[英]plot points in front of lines for each group/ggplot2 equivalent of type=“o”
假設我想繪制一個包含點和線的圖形,其中點出現在每組中相應線的前面 。 特別是,我希望用紅色填充點繪制組1,其中的點通過線連接,但是要用(僅)藍線繪制組2,但是我希望將組2繪制在組1 之上 。例如,在基本圖形中:
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
在ggplot2
干凈地做到這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組線)。 我可以通過手動覆蓋再次geoms,每次一個組做到這一點,但這是丑陋的方式 。
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
工作的低級geom_linepoint
。 我已經研究了一下,這並不完全是瑣碎的事 ……誰能提出更清潔,更簡單的解決方案?
這是“低技術含量” 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(現在已刪除)的答案確實創建了一個新的幾何圖形,似乎已經完成了工作,因此我不確定他為什么刪除了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.