如何在ggplot2中按绘制顺序连接捕食者-猎物模型的数据点?
解决ggplot2按绘制顺序连接数据点的问题
嗨,我来帮你搞定这个连线需求!你已经生成了捕食者-猎物系统的种群数据,现在只需要在ggplot里添加一个小图层,就能按点的生成顺序(也就是k从1到100的顺序)连接它们了,具体方法如下:
核心思路:用geom_path()按数据行顺序连接点
你的popdata是按k从1到100逐行添加的,数据框的行顺序就是点的绘制顺序,而ggplot2里的geom_path()会严格按照数据框中观测的顺序来连接点,正好匹配你的需求。
1. 捕食者vs猎物的相图(带连线)
修改你原来的第一个ggplot代码,添加geom_path()即可:
ggplot(popdata, aes(predator, prey, color = k, group = 1)) + geom_point() + geom_path(linewidth = 0.8) # linewidth可按需调整连线粗细
这里加上
group=1是为了确保所有点被归为同一组,避免因color=k(连续变量)导致的自动分组问题,保证连线完整连贯。
2. 种群随k变化的时序图(带连线)
对于后面两个以k为x轴的图,因为k本身是递增的,和数据行顺序一致,所以用geom_line()或者geom_path()都可以,效果完全相同:
# 捕食者种群随k变化的图 ggplot(popdata, aes(k, predator, color = k)) + geom_point() + geom_line(linewidth = 0.8) # 猎物种群随k变化的图 ggplot(popdata, aes(k, prey, color = k)) + geom_point() + geom_line(linewidth = 0.8)
完整可运行代码
把修改后的代码整合到你的原有代码里,就是这样:
basepop <- matrix(c(10,30),nrow = 2) matrixA <- matrix(c(0.4,-0.325,0.3,1.2),nrow = 2) z <- eigen(matrixA) eigenmatrix <- z$vec eigeninverse <- solve(eigenmatrix) constmatrix <- eigeninverse %*% basepop popdata = NULL for(k in 1:100){ predator <- c(constmatrix[1,1]*z$val[1]^k*z$vec[1,1] + constmatrix[2,1]*z$val[2]^k*z$vec[1,2]) prey <- c(constmatrix[1,1]*z$val[1]^k*z$vec[2,1] + constmatrix[2,1]*z$val[2]^k*z$vec[2,2]) popdata = rbind(popdata, data.frame(k,predator,prey)) } library(ggplot2) # 捕食者vs猎物相图(带连线) ggplot(popdata, aes(predator, prey, color = k, group = 1)) + geom_point() + geom_path(linewidth = 0.8) # 捕食者种群时序图(带连线) ggplot(popdata, aes(k, predator, color = k)) + geom_point() + geom_line(linewidth = 0.8) # 猎物种群时序图(带连线) ggplot(popdata, aes(k, prey, color = k)) + geom_point() + geom_line(linewidth = 0.8) print(popdata)
这样你就能得到按绘制顺序完美连接的图形啦!
内容的提问来源于stack exchange,提问作者Rigers Zaimi
相关产品推荐
相关产品推荐

