10

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

首先,这是地图,以红色突出显示参考比例(例如,在 X 轴上,从 -6000 到 -4000 有 20 米的距离;在 Y 轴上,从 900 到 2100 有 12 米)。 在此处输入图像描述

我的 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)

结果图表是:

在此处输入图像描述

现在,我的问题涉及将地图包含为 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)

在此处输入图像描述

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

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

1 回答 1

1

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

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

在此处输入图像描述

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

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

background_image使用从包中设置背景ggpubr,即使数据相同,旧方块也不会与新方块对齐。这是意料之中的,因为 ggsave 在图像周围添加了一个细边框

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

在此处输入图像描述

但是,通过annotation_custom改用(请参阅指南),您可以调整图像的最小值和最大值。玩弄边框参数,我能够让图像背景和图形对齐。

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()

在此处输入图像描述

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

于 2018-06-19T17:34:34.690 回答