改变绘制geom_polygon的顺序,ggplot

3
我正在使用R / ggplot创建全球地图,并标注世界地震带。我正在使用这里的修改后的shapefile:http://gmo.gfz-potsdam.de/
绘图中有9个图层和4400多个组。但是,其中一些图层应该有空洞,但实际上没有。因此,为了解决这个问题,我需要先渲染这些多边形,使它们出现在后面。在使用geom_polygon时,我如何更改多边形的渲染顺序?
require("rgdal") # requires sp, will use proj.4 if installed
require("maptools")
require("ggplot2")
gpclibPermit() # required for fortify method
require("plyr")

fill_colours <- c("#dddddd", "#8FC463FF", "#46A742FF", "#FFFC00FF", "#F2B212FF", "#E9726AFF", "#D92C50FF", "#FF1B23FF", "#B1681FFF")

eq.shp = readOGR(dsn=".", "PGA_PolygonsPY v2_region")

# Create a discrete scale, there are probably more efficient ways of doing this
eq.shp$MAXVALUE[eq.shp$MAXVALUE==10.0] = 9
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 4.8] = 8
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 4.0] = 7
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 3.2] = 6
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 2.4] = 5
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 1.6] = 4
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 0.8] = 3
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 0.4] = 2
eq.shp$MAXVALUE[eq.shp$MAXVALUE== 0.2] = 1
eq.shp$MAXVALUE  <- sprintf("%d", eq.shp$MAXVALUE)

eq.shp@data$id = rownames(eq.shp@data)
eq.points = fortify(eq.shp, region='id')

# Join the data frames back together
eq.df = join(eq.points, eq.shp@data, by='id')

p <- ggplot()
p <- p + geom_polygon(data = eq.df, aes(long, lat, group=group, fill=MAXVALUE))
p <- p + scale_fill_manual(values=fill_colours) 
p <- p + coord_equal(ratio = 1, xlim=c(65, 85), ylim=c(35, 45))
p    

这段代码生成了以下的图表。
ggplot output

如果你将上面的图表与原始数据(使用GIS软件绘制的)进行比较,你会发现以下问题: - 原始图表中点(Long=77, Lat=42)周围的区域不存在。这是因为棕色多边形最后被渲染。 - 对于大绿色区域(经度Long=80,纬度Lat=38),它全部变成了黄色。这是因为黄色多边形在绿色多边形之后被渲染。 - 我不太关心缺失的洞,例如(经度Long=74,纬度Lat=39)附近的区域。

Original data from GIS software


1
我认为这是 https://dev59.com/kWfWa4cB1Zd3GeqPhn8-#12051993 的完全重复,而我今天早些时候已经回答过了。 - Andrie
1
也许可以在分组变量上使用 reorder 函数? - ROLO
@Andrie,谢谢你的建议。但是它没有起作用。我不太关心孔洞,而更关心图层的顺序。我已经更新了我的帖子并提供了一些视觉示例。 - psiphi75
@ROLO,谢谢,我尝试查找了一下,但是我不知道如何将其应用到我的情况中。你有例子吗? - psiphi75
@psiphi75:你有实际的shapefile链接吗?我在网站上查看了ArcGIS版本,但没有叫做PGA_PolygonsPY v2_region"的图层。 - user666993
显示剩余2条评论
1个回答

3

好的,我已经能够解决这个问题。虽然有点绕路并且渲染时间增加了,但它满足了我的要求。

与其尝试使用ggplot来排序/重新排序多边形的渲染,我通过使用for循环来强制执行这一点,并按照需要呈现图层。

解决方案:

替换以下代码:

p <- p + geom_polygon(data = eq.df, aes(long, lat, group=group, fill=MAXVALUE))

以下是:

for (i in seq(9, 1, -1)) {
    p <- p + geom_polygon(data = eq.df[eq.df$MAXVALUE==sprintf("%d", i),], aes(long, lat, group=group, fill=MAXVALUE))
}

这导致多边形按照我所希望的顺序呈现。然后,我得到了与原始图像非常相似的东西:

enter image description here

但是,我发现自己引入了新问题,有些多边形没有孔,因此渲染它们会导致它们覆盖其他层的一些部分。因此,我需要在多边形中创建孔以正确地呈现它们。

感谢所有留下评论的人。

更新: 上述解决方案可用于重新排序多边形的呈现,但它并未完全解决潜在问题。似乎需要使用更复杂的算法才能解决。我还尝试按多边形的面积和加权面积进行排序,但都无法实现理想的解决方案。最终的解决方案将需要一些手动干预。


2
我认为更好的方法是对您的group变量进行排序。虽然我没有在此处的数据上尝试过,但它确实适用于我的数据:eq.df <- eq.df[with(eq.df, order(MAXVALUE, id, order)),]; eq.df$group <- ordered(eq.df$group, unique(eq.df$group))。然后像您在这里所做的那样尝试绘图。 - Mikko

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