如何在ggplot中获取geom_line的所有控制点以复现绘制的线条
问题背景
我之前参考相关方法已经成功获取到了ggplot中geom_curve的控制点,现在想把同样的思路用到geom_line上,获取我绘制的geom_line上的所有坐标点,用来复现这条线。
我知道b$data[[1]]可以拿到曲线的起止点,p$layers[[1]]$geom_params可以拿到曲率、角度这类曲线参数,但不知道怎么获取geom_line上的所有坐标点。
我的绘图代码如下:
C <- ggplot() + geom_sf(data = world, fill = "grey69", size = 0.1, colour = "transparent") + scale_x_continuous(limits = c(-180, 180), breaks = seq(-180, 180, by = 40)) + scale_y_continuous(limits = c(-90, 90), breaks = seq(-90, 90, by = 30)) + coord_sf(expand = FALSE) + labs(x = "Longitude", y = "Latitude") + geom_sf(data = world, color = "grey87", fill = "grey87", size = 0.1) + geom_line(aes(c(19, 6),c(-32,-40)), lineend = "round", size = 0.4, col = "gray20", linetype = "solid", alpha = 0.6)
解决方法
geom_line和geom_curve的逻辑不同:geom_curve是贝塞尔曲线,需要计算额外的中间控制点才能生成曲线;而geom_line默认是用直线直接连接你传入的原始数据点,本身没有额外自动生成的控制点,你可以根据需求选择获取对应的数据:
1. 获取原始传入的坐标点
直接从图层的原始数据中就能拿到:
# 你的代码中geom_line是第3个图层,可先打印C$layers确认图层顺序 raw_line_data <- C$layers[[3]]$data
返回结果就是你写在aes里的两组坐标:x为19、6,y为-32、-40,用这两个点连直线就能复现基础的geom_line效果。
2. 获取经过坐标变换、投影后的实际渲染坐标
你用到了coord_sf空间坐标系统,原始坐标会经过投影转换,如果你要的是最终渲染在图上的实际坐标,可以用ggplot_build处理绘图对象:
library(ggplot2) # 处理绘图对象,获取所有渲染相关数据 build_data <- ggplot_build(C) # 提取geom_line图层的渲染后数据 rendered_line_data <- build_data$data[[3]]
返回结果中的x、y列就是投影转换后的实际坐标,如果你的线跨特殊投影边界被自动拆分,拆分后的所有点也会在这里返回。
3. 自定义生成直线上的插值点
如果你需要直线上更多中间点用来复现线条,可以直接对原始起止点做线性插值:
# 按需设置插值点数量,这里设为100 point_num <- 100 interp_x <- seq(from = 19, to = 6, length.out = point_num) interp_y <- seq(from = -32, to = -40, length.out = point_num) # 插值后的所有点 interp_line <- data.frame(x = interp_x, y = interp_y)
用这些点绘制的直线和原geom_line效果完全一致。
内容的提问来源于stack exchange,提问作者Isabelle
相关产品推荐
相关产品推荐

