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

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

library(sf)
library(tmap)

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

tm_shape(nc) +
  tm_borders()

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

这看起来不错。但是,如果更改边界线的样式,则多边形之间的边界看起来与轮廓不同。以下是一个示例。我将线型更改为点线。一些线段看起来很实心或带有许多点。

tm_shape(nc) +
  tm_borders(lwd = 1,lty = "dotted")

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

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

tm_shape(nc) +
  tm_borders(lwd = 2,alpha = 0.6)

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

我想了解为什么会发生这种情况,以及如何使所有边界和轮廓的线型通用。如果有任何提示或想法,我将不胜感激。

更新:其他绘图选项

在这里,我尝试了其他选项来模拟带有虚线边界的地图。 geom_sfggspatial可以生成点图非常相似的边界图。但是,如果我更改了sf对象并使用base R包中的spplotsp对其进行了绘制,问题仍然存在。

geom_sf

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

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

ggspatial

library(ggspatial)
library(ggplot2)
library(sf)

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

ggplot() +
  layer_spatial(nc,axis.ticks = element_blank())

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

带有SP对象的基本R

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

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

带有SP对象的绘图

library(sf)
library(sp)

nc <- st_read(system.file("shape/nc.shp","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')))

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

joenzhou 回答:使用tmap包绘制时,两个多边形之间的边界线似乎与轮廓线不同

这两个问题有关。多边形具有共享的边界,因此在绘制边界时,您会绘制过度。

使用 <Grid> <Button BackgroundColor="LightCoral" VerticalOptions="Center" HorizontalOptions="Center" Text="Hi there"/> </Grid> ,点在某些边界上对齐,因此显示为点线。在其他边界上,两组点未对齐,因此一组点填充了另一组点的间隙。

使用<AbsoluteLayout> <Button BackgroundColor="LightCoral" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0.5,0.5,0.2,0.2" Text="Hi there"> </Button> </AbsoluteLayout> 时,共享边界变得更暗-它们被绘制两次,因此得到了加强。一个功能特有的边界部分不会被过度绘制。

老实说,如果要使用虚线样式或透明度,没有简单的方法可以解决此问题。您需要做的是将边界的唯一部分识别为LINESTRING对象,然后可以绘制每个边界一次,而不会过度绘制。

作为演示,这显示了两个县的Alpha问题

lty

problem with alpha

您可以分隔出边框的每个部分:

alpha

enter image description here

但是,这取决于实际共享边界线-以便完美重叠。我怀疑沿着共享边界的有趣破折号可能是因为该边界被不完全重叠的部分分解了。下面的代码表明发生了这种情况:边界没有完美地覆盖,因此交集不包括整个边界。将ncsub <- nc[1:2,] plot(st_geometry(ncsub),lwd=4,border='#00000099') 应用于结果会得到一组短线,每条短线都重新开始破折号序列,导致间隔错开。

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,col='blue',lty=2)
plot(shared,col='black',lty=2)

enter image description here

我认为您需要使用适当的拓扑区域模型中的数据来干净地执行此操作,因为边界是真正共享的实体。例如,请参见:https://grasswiki.osgeo.org/wiki/Vector_topology

,

这确实不是一件容易的事。

解决这个难题的棘手方法可能是将多边形转换为线,然后获得一条唯一的线并进行绘制。

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

enter image description here

本文链接:https://www.f2er.com/2975590.html

大家都在问