gpt4 book ai didi

r - 更改绘图 geom_polygon、ggplot 的顺序

转载 作者:行者123 更新时间:2023-12-04 04:22:01 24 4
gpt4 key购买 nike

我正在使用 R/ggplot 创建包含世界地震带的全局 map 。我正在使用来自此处的修改后的 shapefile:http://gmo.gfz-potsdam.de/ .

地 block 共有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

最佳答案

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

我没有尝试使用 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

但是,我可以看到我引入了新问题,有些多边形没有孔,因此渲染它们会导致它们覆盖其他一些层。所以我需要在多边形中创建孔以正确渲染它们。

感谢所有留下评论的人。

更新:上面的解决方案可以重新排序多边形的渲染,但并不能完全解决根本问题。看来您需要更复杂的算法才能这样做。我还尝试按多边形面积排序,然后按多边形加权面积排序,但都无法实现理想的解决方案。最终的解决方案需要一些人工干预。

关于r - 更改绘图 geom_polygon、ggplot 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12054321/

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