用户定义形状列上的tmap tm_dots行为

时间:2019-06-25 05:00:17

标签: r tmap

tm点似乎在标识给定观测值所需形状的列上有问题

来自形状枚举:

0 =空心方形

1 =空心圆

22 =实心正方形

21 =空心圆

当我将shape参数设置为'shapeCol'时 其中shapeCol是0/1(开放形状)的列,它将返回一个已填充但正确的形状

当我手动将形状设置为0时 它会返回正确的开放形状,但我需要通过观察来改变形状

创建随机空间数据的数据帧

library(sf)
library(tmap)
library(dplyr)

newDf <- data.frame(location=letters[1:30],
                lat=32+runif(30,0.01,0.03),
                lon=-97+runif(30,.01,.03)) %>%
                mutate(rowID=1:n(),
                reservoir=case_when(rowID<=15 ~ 'Codell',
                TRUE ~'Niobrara'))

newSf <- st_as_sf(newDf,coords=c('lon','lat'),crs=4326)

分配形状值/数字索引

shapes <- c('Niobrara'='circle',
            'Codell'='square')

shapeVals <- c('circle'=21,'square'=22,'triangleup'=24,'diamond'=23,'triangleDown'=25)
borderVals <- c('circle'=0,'square'=1,'triangleup'=2,'diamond'=5,'triangleDown'=6)


newSf.fin <- newSf %>% mutate(shapeType = shapes[reservoir],
                           shapeCol = as.factor(shapeVals[shapeType]),
                           borderCol = as.factor(borderVals[shapeType]))

newSf.fin %>% select(borderCol) # 0 and 1 / Open Shapes

#returns filled shapes despite shape column only referencing open values
tm_shape(newSf.fin) + tm_dots(shape='borderCol',size=2)

incorrect

#returns open shapes by manually setting shape value
tm_shape(newSf.fin) + tm_dots(shape=0,size=2)

correct

我知道可以通过映射/循环来缓解这种情况,但是色标会更成问题且更困难。有没有一种方法可以根据列值获得正确的打开形状?

1 个答案:

答案 0 :(得分:1)

我不是tmap专家,但这似乎是一种误解。

在文档中说明了shape参数:

  符号的

个形状。直接形状规格或数据   映射到形状指定的符号的变量名称   论点。查看形状规格的详细信息。

关于shapes参数,它说:

  

符号形状的调色板。仅在形状为(的向量)时适用   分类变量。请参阅形状规格的详细信息。通过   默认情况下,采用21到25的填充符号。

因此,当您执行shape = 0时,您正在执行直接形状指定。这就是为什么它起作用。使用变量名时,需要将其类别映射到shapes参数。您没有这样做,所以它需要21和22,这是它的默认形状,分别是正方形和实心圆。

这就是我的工作方式:

tm_shape(newSf.fin) + tm_dots(shape= 'borderCol',size=2, shapes = c(1, 0))