You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:37:39