首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用tmap包绘制时,两个多边形之间的边界线似乎与轮廓不同。

当使用tmap包绘制时,两个多边形之间的边界线似乎与轮廓不同。
EN

Stack Overflow用户
提问于 2019-12-04 18:01:37
回答 2查看 961关注 0票数 3

我正在用tmap包绘制几个多边形的边界。下面的代码是一个基本示例。

代码语言:javascript
复制
library(sf)
library(tmap)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

tm_shape(nc) +
  tm_borders()

这个看起来不错。然而,如果我改变了边界线的样式,多边形之间的边界看起来与轮廓不同。下面是一个例子。我把线的类型改为虚线。一些线段看起来很坚固,或者有很多点。

代码语言:javascript
复制
tm_shape(nc) +
  tm_borders(lwd = 1, lty = "dotted")

这是另一个例子。我将线宽更改为2,透明度更改为0.6。我们可以看到,许多内部边界看起来比轮廓更强大。

代码语言:javascript
复制
tm_shape(nc) +
  tm_borders(lwd = 2, alpha = 0.6)

我想知道为什么会发生这种情况,以及如何使线条风格对所有边界和轮廓具有普遍性。如有任何提示或建议,我将不胜感激。

更新:其他绘图选项

在这里,我尝试了其他选项,以模仿地图的虚线边界。geom_sfggspatial可以用非常相似的虚线生成边界图。但是,如果我更改了sf对象,并使用base Rsp包中的spplot绘制了它,那么问题仍然存在。

geom_sf

代码语言:javascript
复制
library(ggplot2)
library(sf)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

ggplot() +
  geom_sf(data = nc, linetype = "dotted", fill = "white") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())

ggspatial空间

代码语言:javascript
复制
library(ggspatial)
library(ggplot2)
library(sf)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

ggplot() +
  layer_spatial(nc, linetype = "dotted", fill = "white") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank())

Base与SP对象

代码语言:javascript
复制
library(sf)
library(sp)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc_sp <- as(nc, "Spatial")

plot(nc_sp, col = "white", lty = "dotted")

带有SP对象的spplot

代码语言:javascript
复制
library(sf)
library(sp)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc_sp <- as(nc, "Spatial")
nc_sp$Z <- 1

spplot(nc_sp, zcol = "Z", col.regions = "white", lty = 3, 
       colorkey = FALSE,
       par.settings = list(axis.line = list(col =  'transparent')))

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-06 20:37:05

这两个问题都是相关的。多边形有共同的边界,所以当你绘制边界时,你会被过度绘制。

使用lty时,点在某些边框上对齐,因此显示为虚线。在其他边界上,这两组点没有对齐,因此一组点填补了另一组的空白。

对于alpha来说,共享的边界更加黑暗--它们被绘制了两次,因此得到了加强。对于一个特性来说,边框中唯一的部分不会被过度绘制。

老实说,如果您想要使用虚设的样式或透明性,那么解决这个问题并不容易。您需要做的是将边框的唯一部分标识为LINESTRING对象,然后可以在不过度绘制的情况下绘制每个边界一次。

作为一个演示,这里显示了两个县的alpha问题

代码语言:javascript
复制
ncsub <- nc[1:2,]
plot(st_geometry(ncsub), lwd=4, border='#00000099')

您可以将边界的每一段分开:

代码语言:javascript
复制
borders <- st_cast(st_geometry(ncsub), 'MULTILINESTRING')
border1 <- st_difference(borders[1], borders[2])
border2 <- st_difference(borders[2], borders[1])
shared <- st_intersection(borders[1], borders[2])

plot(st_geometry(ncsub), col=c('salmon', 'cornflowerblue'), border=NA)
plot(border1, add=TRUE, col='red', lwd=2, lty=2)
plot(border2, add=TRUE, col='blue', lwd=2, lty=2)
plot(shared, add=TRUE, col='black', lwd=2, lty=2)

然而,要做到这一点,则需要实际共享边界线--这样就可以完美地重叠。我怀疑沿着共享边界看上去有趣的破折号可能是因为边界被不太重叠的部分分割开了。下面的代码显示了正在发生的事情:边界不是完全覆盖的,所以交集不包括整个边界。将lty=2应用于结果给出了一组短行,每条短线都会再次启动虚线序列,从而导致交错间距。

代码语言:javascript
复制
plot(st_geometry(ncsub), col=c('salmon', 'cornflowerblue'), border=NA)
plot(st_cast(shared, 'LINESTRING'), col=c('black','white'), add=TRUE, lwd=2)

我认为你需要一个合适的拓扑区域模型中的数据才能做到这一点,在这里边界是真正的共享实体。参见,例如:https://grasswiki.osgeo.org/wiki/Vector_topology

票数 7
EN

Stack Overflow用户

发布于 2019-12-07 17:52:34

这确实不是一项容易的任务。

解决这个问题的一个棘手的方法是将多边形转换成直线,然后得到一条独特的线并绘制它。

代码语言:javascript
复制
library(sf)
library(tmap)

nc <- st_read(system.file("shape/nc.shp", package = "sf"))

ncLines <- st_cast(nc, to = "MULTILINESTRING")
ncLines2 <- st_union(ncLines)

tm_shape(ncLines2) + tm_lines(lty = "dotted")

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59182204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档