R语言绘图报错:Error in calcCurveGrob(...) : end points must not be identical
解决geom_curve报错:"end points must not be identical"
错误原因
你的flights数据中存在出发机场和到达机场为同一地点的记录,导致geom_curve的起点(lon.x, lat.x)和终点(lon.y, lat.y)坐标完全重合,无法生成曲线,触发该错误。
解决方案
在合并数据集后,添加过滤步骤,移除这些同机场的航班记录:
# 方法1:通过机场名称过滤 flights <- flights %>% filter(From != To) # 方法2:通过经纬度坐标过滤(更严谨,避免名称不一致但坐标相同的情况) flights <- flights %>% filter(lon.x != lon.y | lat.x != lat.y)
额外排查步骤
- 先查看有多少条问题记录,方便确认问题规模:
sum(flights$lon.x == flights$lon.y & flights$lat.x == flights$lat.y) - 如果过滤后地图仍空白,请检查
airports数据的经纬度是否正确:比如是否搞混了经度和纬度,或者坐标系不符合要求(通常地图绘制使用WGS84坐标系)
修正后的完整代码
library(ggplot2) library(ggrepel) library(dplyr) library(ggmap) library(corrr) flights <- read.csv("Flights.csv", stringsAsFactors = FALSE) airports <- read.csv("Airports.csv") flights <- merge(flights, airports, by.x="To", by.y="destin") flights <- merge(flights, airports, by.x="From", by.y="airport") # 过滤起点终点相同的航班 flights <- flights %>% filter(From != To) worldmap <- borders("world", colour="#efede1", fill="#efede1") ggplot() + worldmap + geom_curve(data=flights, aes(x = lon.x, y = lat.x, xend = lon.y, yend = lat.y), col = "#b29e7d", size = 1, curvature = .2) + geom_point(data=airports, aes(x = lon, y = lat), col = "#970027") + geom_text_repel(data=airports, aes(x = lon, y = lat, label = airport), col = "black", size = 2, segment.color = NA) + theme(panel.background = element_rect(fill="white"), axis.line = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank() )
内容的提问来源于stack exchange,提问作者Parag Sengupta
相关产品推荐
相关产品推荐

