如何在ggplot2中绘制MST线段?解决美学长度不匹配问题
解决ggplot2绘制最小生成树线段的美学属性长度不匹配问题
你遇到的问题根源在于ggplot2的工作逻辑和base R的segments()不一样——geom_segment需要每个线段对应数据框中的一行,而你现在直接用原数据框(10行)来映射只有9个元素的from/to索引,自然会出现长度不匹配的报错。
我们可以通过创建一个专门的线段数据框来解决这个问题,具体步骤如下:
- 先把起点和终点的坐标整理成每行对应一条线段的数据框
- 在
geom_segment中使用这个线段数据框,而不是原数据框
修正后的ggplot2代码
# 模拟数据(和你原来的一致) n=10 set.seed(1984) d1<-matrix(rnorm(n,mean=2,sd=1), n/2, 2) d2<-matrix(rnorm(n,mean=-2,sd=.5), n/2, 2) d<-rbind(d1,d2) df<-as.data.frame(d) # 起点和终点索引 from<-c(1,1,2,2,4,6,7,7,10) to<-c(5,2,3,4,6,7,9,10,8) # 创建线段专用数据框 seg_df <- data.frame( x = df[from, 1], y = df[from, 2], xend = df[to, 1], yend = df[to, 2] ) library(ggplot2) # 绘制:先画点,再用seg_df画线段 ggplot(df, aes(V1, V2)) + geom_point() + geom_segment(data = seg_df, aes(x = x, y = y, xend = xend, yend = yend), colour = "red")
为什么这样能解决问题?
- 原数据框
df有10行,对应10个散点;而seg_df有9行,正好对应你要画的9条线段 geom_segment会遍历seg_df的每一行,绘制一条从(x,y)到(xend,yend)的线段,完美匹配ggplot2的美学映射规则
这样就能得到和base R一样的最小生成树可视化效果,同时符合ggplot2的语法规范啦。
内容的提问来源于stack exchange,提问作者allanvc
相关产品推荐
相关产品推荐

