R ggplot2按经纬度方向设置坐标轴coordinate_IDs排序的实现方案
按地理方向自动设置ID因子层级的实现方案
你需要的自动排序功能可以通过对经纬度数值做排序直接实现,无需手动枚举levels,以下是可直接复用的实现:
通用函数实现
getDirectionalLevels <- function(df, id_col = "ID", lon_col = "Long", lat_col = "Lat", sort_by = "lon", # 可选参数:lon按经度排序、lat按纬度排序 desc = FALSE) { # 可选参数:是否降序排列 # 按指定维度排序后提取ID顺序作为因子层级 if(sort_by == "lon") { sorted_df <- df[order(df[[lon_col]], decreasing = desc), ] } else if(sort_by == "lat") { sorted_df <- df[order(df[[lat_col]], decreasing = desc), ] } else { stop("sort_by参数仅支持lon(经度)或lat(纬度)") } # 重设ID的因子层级 df[[id_col]] <- factor(df[[id_col]], levels = unique(sorted_df[[id_col]])) return(df) }
调用示例
匹配你当前需要的「x轴从右到左按从东到西排列」的需求,西经场景下经度数值越大越靠东,所以按经度降序排列即可:
# 按经度降序排列(从东到西)设置ID层级 test_df_processed <- getDirectionalLevels(test_df, sort_by = "lon", desc = TRUE) # 直接绘图即可得到预期的x轴顺序 test_df_processed %>% ggplot() + geom_point(aes(x = ID, y = Value))
其他常用场景的参数调整:
- 要实现从西到东排列:设置
desc = FALSE - 要按纬度从南到北/从北到南排列:设置
sort_by = "lat",同步调整desc参数即可 - 如果你的ID列、经纬度列名不是默认值,传入对应的列名参数即可,比如经度列叫
lon时增加参数lon_col = "lon"
斜向廊道的扩展处理
如果点位沿非东西/南北走向的斜向廊道分布,可以通过PCA自动识别廊道走向,再按投影位置排序,适配任意走向的线性廊道:
getCorridorLevels <- function(df, id_col = "ID", lon_col = "Long", lat_col = "Lat") { # 提取经纬度矩阵做PCA,第一主成分即为廊道走向 coords <- as.matrix(df[, c(lon_col, lat_col)]) pca <- prcomp(coords, scale. = TRUE) # 按第一主成分得分排序得到廊道顺序 df$pc1 <- pca$x[,1] sorted_df <- df[order(df$pc1), ] df[[id_col]] <- factor(df[[id_col]], levels = unique(sorted_df[[id_col]])) df$pc1 <- NULL return(df) }
内容的提问来源于stack exchange,提问作者Pramesh Pudasaini
相关产品推荐
相关产品推荐

