如何调整ggplot中PUBG地图背景图的坐标至0-8e+05范围?
调整Miramar地图坐标范围到0至8e5的解决方案
嘿Lucy,我帮你梳理一下怎么把Miramar地图的坐标范围精准调整到0到8e5,刚好我之前也处理过类似的图像坐标映射问题,给你两种常用的实现方式:
方法一:用R基础绘图系统
这种方式适合习惯用基础plot函数的场景,核心是先锁定绘图区域的坐标范围,再把图像按比例映射进去:
library(jpeg) # 读取地图图像 miramar <- readJPEG("/Users/lucyzhang/Waterloo/stat 847/project/pubg/miramar.jpg") # 获取图像的原始宽高(注意dim返回的顺序是:高度、宽度、通道数) img_h <- dim(miramar)[1] img_w <- dim(miramar)[2] # 目标坐标范围 target_min <- 0 target_max <- 8e5 # 计算缩放因子,确保图像按比例适配目标范围,避免拉伸变形 scale_ratio <- min(target_max / img_w, target_max / img_h) scaled_w <- img_w * scale_ratio scaled_h <- img_h * scale_ratio # 计算图像在目标区域内的居中位置 x_left <- (target_max - scaled_w) / 2 x_right <- x_left + scaled_w y_bottom <- (target_max - scaled_h) / 2 y_top <- y_bottom + scaled_h # 创建空的绘图区域,锁定坐标范围 plot(1, type = "n", xlim = c(target_min, target_max), ylim = c(target_min, target_max), xlab = "X坐标", ylab = "Y坐标", main = "Miramar地图(坐标0-8e5)") # 绘制地图图像 rasterImage(miramar, xleft = x_left, xright = x_right, ybottom = y_bottom, ytop = y_top) # 同步调整死亡点的坐标(如果你的点是基于原始图像坐标的话) deaths1$scaled_x <- deaths1$x * scale_ratio + x_left deaths1$scaled_y <- deaths1$y * scale_ratio + y_bottom # 绘制死亡点 points(deaths1$scaled_x, deaths1$scaled_y, col = "red", pch = 16, cex = 0.8)
方法二:用ggplot2(更直观的可视化)
如果你用ggplot2做可视化,用annotation_raster可以更方便地控制图像位置:
library(jpeg) library(ggplot2) # 读取地图图像 miramar <- readJPEG("/Users/lucyzhang/Waterloo/stat 847/project/pubg/miramar.jpg") # 计算缩放比例,保持图像原始比例 scale_ratio <- min(8e5 / dim(miramar)[2], 8e5 / dim(miramar)[1]) scaled_w <- dim(miramar)[2] * scale_ratio scaled_h <- dim(miramar)[1] * scale_ratio # 调整死亡点坐标(和图像同步缩放) deaths1$scaled_x <- deaths1$x * scale_ratio + (8e5 - scaled_w)/2 deaths1$scaled_y <- deaths1$y * scale_ratio + (8e5 - scaled_h)/2 # 绘制可视化图 ggplot() + # 添加地图背景,锁定坐标范围 annotation_raster(miramar, xmin = (8e5 - scaled_w)/2, xmax = (8e5 + scaled_w)/2, ymin = (8e5 - scaled_h)/2, ymax = (8e5 + scaled_h)/2) + # 强制保持图像比例,避免拉伸 coord_fixed(ratio = dim(miramar)[2]/dim(miramar)[1]) + # 设置全局坐标范围为0-8e5 xlim(0, 8e5) + ylim(0, 8e5) + # 添加死亡点 geom_point(data = deaths1, aes(x = scaled_x, y = scaled_y), color = "red", size = 1.5, alpha = 0.6) + labs(x = "X坐标", y = "Y坐标", title = "Miramar地图死亡位置分布") + theme_minimal()
关键注意点:
- 如果你的死亡数据坐标原本就是对应0-8e5的,那可以跳过坐标缩放的步骤,直接把图像映射到这个范围就行;
- 一定要用
scale_ratio来保持图像比例,不然地图会变形,影响点的位置准确性; - 如果你希望图像完全填满0-8e5的区域(接受轻微拉伸),可以去掉比例计算,直接把
xmin=0, xmax=8e5, ymin=0, ymax=8e5传给annotation_raster或者rasterImage。
内容的提问来源于stack exchange,提问作者Lucy Zhang
相关产品推荐
相关产品推荐

