gpt4 book ai didi

r - 在 R 中组合 map 和 XY ggplot 图表

转载 作者:行者123 更新时间:2023-12-02 04:55:10 26 4
gpt4 key购买 nike

我需要将代表考古遗址的 map 与不同考古对象的 XY ggplot 图表结合起来。 map 位于 tiff 文件中,必须遵守其比例。

首先,这是 map ,以红色突出显示引用比例(例如,在X轴上,从-6000到-4000有20米的距离;在Y轴上,从900到2100有12米) 。 enter image description here

我的ggplot图表是通过运行以下代码获得的:

archaeo <- ggplot() + 
geom_ellipsis(data=Unit_H,
aes(x0 = X, y0 = Y, a = Diameter_E.W/2+250, b = Diameter_N.S/2+250, angle = 0),
lwd=0, col="darkgray", fill="gray", alpha=0.15) +
geom_ellipsis(data=Unit_H,
aes(x0 = X, y0 = Y, a = Diameter_E.W/2+120, b = Diameter_N.S/2+120, angle = 0),
lwd=0, col="darkgray", fill="gray", alpha=0.25) +
geom_ellipsis(data=Unit_H,
aes(x0 = X, y0 = Y, a = Diameter_E.W/2, b = Diameter_N.S/2, angle = 0),
lwd=0.5, col="darkgray", fill="gray", alpha=0.75) +
geom_point(data=Unit_H, aes(X, Y), size = 0.5) +
geom_point(data=Refits_H_trans, aes(x,y,group=sample, colour=factor(sample))) +
geom_line(data=Refits_H_trans, lwd=0.2, lty=1, aes(x,y, group=sample, colour=factor(sample))) +
coord_fixed() +
theme_bw() +
theme(legend.position="none") +
ggtitle("Unit H") +
xlim(-6600,-3800) +
ylim(400,2400)

结果图表是:

enter image description here

现在,我的问题涉及将 map 作为 ggplot 的背景。我使用了 ggpubr 中的background_image(),结果如下:

map_levelH <- readPNG("Planta H-I.png")

Map.archaeo <- ggplot() +
background_image(map_levelH) +
geom_ellipsis(data=Unit_H,
aes(x0 = X, y0 = Y, a = Diameter_E.W/2+250, b = Diameter_N.S/2+250, angle = 0),
lwd=0, col="darkgray", fill="gray", alpha=0.15) +
geom_ellipsis(data=Unit_H,
aes(x0 = X, y0 = Y, a = Diameter_E.W/2+120, b = Diameter_N.S/2+120, angle = 0),
lwd=0, col="darkgray", fill="gray", alpha=0.25) +
geom_ellipsis(data=Unit_H,
aes(x0 = X, y0 = Y, a = Diameter_E.W/2, b = Diameter_N.S/2, angle = 0),
lwd=0.5, col="darkgray", fill="gray", alpha=0.75) +
geom_point(data=Unit_H, aes(X, Y), size = 0.5) +
geom_point(data=Refits_H_trans, aes(x,y,group=sample, colour=factor(sample))) +
geom_line(data=Refits_H_trans, lwd=0.2, lty=1, aes(x,y, group=sample, colour=factor(sample))) +
coord_fixed() +
theme_bw() +
theme(legend.position="none") +
ggtitle("Unit H") +
xlim(-6600,-3800) +
ylim(400,2400)

enter image description here

如您所见,ggplot 和 map 的比例不匹配。所以,我的问题是:

  • 如何使用 ggplot X 轴和 Y 轴的值对 map 进行地理配准?
  • 我需要保持图像的比例,以免扭曲它。我该怎么做?我问这个问题是因为如果我更改 xlim 值,图像也会发生变化,其比例也会发生变化。

最佳答案

我重新创建了一个存在此问题的简单示例:

library(tidyverse)

# create the background
bck_square <- data.frame(x=c(1,1,0,0),y=c(0,1,1,0))
p <- ggplot(bck_square, aes(x=x, y=y)) +
geom_point(size=10, color="red") +
theme(panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
#panel.background=element_blank(), keep the background to see where image ends
axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank())
p

enter image description here

我将保存图像以用作我的人物的背景:

ggsave("temp.png",p)
img <- readPNG("temp.png")

使用ggpubr包中的background_image设置背景,旧方 block 与新方 block 不对齐,即使数据相同。这是预期的,因为 ggsave 在图像周围添加了细边框

library(ggpubr)
ggplot(bck_square, aes(x, y)) +
background_image(img) +
geom_point()

enter image description here

但是,通过使用 annotation_custom (请参阅 this 指南),您可以调整图像的最小值和最大值应在的位置。通过使用边框参数,我能够使图像背景和图形对齐。

library(png)
library(grid)
min_border <- .064
max_border <- .061
ggplot(bck_square, aes(x, y)) +
annotation_custom(g,xmin=-min_border, xmax=1+max_border, ymin=-min_border, ymax=1+max_border) +
geom_point()

enter image description here

此方法应该适用于 tiff 文件。另一个潜在的解决方案可能是使用 rspatial 进行空间数据转换(请参阅文档 here ),但这可能会使问题变得过于复杂。

关于r - 在 R 中组合 map 和 XY ggplot 图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49778125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com