用ggplot和R将多边形与轮廓进行裁剪

3
我想创建一个轮廓,然后通过多边形剪切轮廓,并仅显示多边形内的轮廓。

可以在这里找到Shapefile数据

可以在这里找到Csv文件

我使用的代码如下:

library("ggplot2")
library("rgdal")
library("gpclib")
library("maptools")
require(sp) 

age2100 <- read.csv("temp.csv",header=TRUE, sep=",")
shape.dir <- "C:/Users/jdbaba/Documents/R working folder/shape" # use your directory name here

lon.shape <- readOGR(shape.dir, layer = "Export_Output_4")
str(lon.shape)

lon.df <- fortify(lon.shape, region = "Id")
p <- ggplot(lon.df, aes(x = long, y = lat, group = group)) +
    geom_polygon(colour = "black", fill = "grey80", size = 1) +
    theme() 

p <- p + geom_point(data=age2100,aes(x=age2100$x,y=age2100$y,group="z"),size=0.1)
p <- p + geom_density2d(colour="red")
p

这里,我创建了地图、点和轮廓。我不知道我使用的代码是否为变量z创建了轮廓。如果不正确,有人能建议我吗?

我得到的示例输出如下:

enter image description here

现在,我想要剪裁多边形内的轮廓,并隐藏多边形外部的轮廓部分。
我想知道如何给轮廓添加标签并控制轮廓间隔。
如果我的问题不清楚,请告诉我。
谢谢。
Jdbaba

那与情节无关。我只是在测试。我会删除它。谢谢。 - Jd Baba
@Arun,这对我有效。也许你需要在会话中调用gpclibPermit()一次。 - agstudy
@Arun,是的,这对我有用,上面的图表是我编写的代码的输出。谢谢。 - Jd Baba
这个等高线图忽略了你的age2100数据框中的'z'值。等高线图仅基于位置绘制,它使用MASS包中的kde2d函数计算的二维核平滑。如果你想要生成z值的平滑地图,那么你需要研究地理统计学,并且将等高线剪裁到一个多边形现在已经不是你面临的最小问题了。 - Spacedman
@Spacedman 你说得对。你知道我怎么在上面的图中绘制z值吗?我尝试过了,但总是出错。我经常遇到的错误是“期望增加'x'和'y'值”。我能否使用离散数据创建具有z值的图? - Jd Baba
1
你的数据是一组不规则间隔的x、y、z三元组。要进行任何平滑处理,你都在试图说明在没有(x、y)点的情况下z值的情况,并且这取决于你对数据背后模型的信念。这就是地质统计学的精髓。去找一本关于地质统计学或克里金的书,在CRAN上阅读空间任务视图,然后回到我们这里。 - Spacedman
1个回答

2
我无法完全复制您的地图。您提供的代码给我一个有两组轮廓线的地图——一组看起来像您的,另一组与其在该地区南部重叠。我怀疑这是由于您的“group”设置造成的。此外,我可以看到在我认为是湖泊南部有一个岛屿。
我喜欢将我的ggplot内容清理并分割成部分,因为我经常发现ggplot调用的早期部分会影响后续部分。以下是我如何映射该地区、绘制点并添加密度轮廓线的方法:
map <- function(){
  geom_polygon(data=lon.df,aes(x=long,y=lat,group=piece),colour="black",fill="grey80",size=1)
}

points <- function(){
  geom_point(data=age2100,aes(x=x,y=y),size=0.1)
}

density <- function(){
  geom_density2d(data=age2100,aes(x=x,y=y),colour="red")
}

ggplot()+map() +points() +density()

这就是它的效果: enter image description here 现在,这看起来与你的轮廓图非常不同,我不知道为什么。也许你的群组参数正在将所有具有相同z值的点分组?
无论如何,似乎你不想要密度图,而是想要一个区域内Z值的地图。这将需要克里金或其他插值技术。暂时忘记ggplot,专注于数字。
首先,绘制以z值为颜色的点。你应该会看到这个: enter image description here 至少这会给你一个正确轮廓的好主意。
总之,这是一个完整的教程...

非常感谢您提供的详细解释。我很喜欢您创建的点图。您能否提供用于创建该图的代码?我使用颜色上的z创建了点图。但是我无法得到与您创建的相似的图。那看起来真的很棒,非常感谢。 - Jd Baba
将您的点制作成SpatialPointsDataFrame并使用spplot,但我不喜欢那种颜色方案,所以我使用了包autoMap中的automapPlot。该软件包还可以进行您可能需要的平滑处理... - Spacedman
嗨,Spacedman,感谢您的回复。我非常感激您的帮助。但是,由于我对spplot和automaplot都很陌生,所以我想请求您提供用于创建图形的代码。我尝试了解这些软件包已经花费了大约一个小时的时间,试图创建您所做的内容,但是我无法做到。我今天还要在几个小时后进行演示,所以您的代码对我来说很重要。之后我会花更多时间学习spplot和automaplot以获得更好的理解。感谢您的合作。 - Jd Baba
在R和空间数据方面,您可以寻找更多的帮助,或者在SO上提出一些新的简单问题,我们很乐意为您解答。这些问题不应该与此问题相关联。 - Spacedman
感谢您的建议。在深入研究后,我编写了一些代码来帮助创建地图。使用以下库:library(maptools)、library(rgdal)、library(sp)data <- read.table("temp.csv",sep=",",header=TRUE) data str(data)coordinates(data)=~x+y str(data)spplot(data) - Jd Baba
我能够通过以下命令复制出完全相同的图表: p1 <- automapPlot(data1,auto.key=F) p1 - Jd Baba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接