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)
#returns open shapes by manually setting shape value
tm_shape(newSf.fin) + tm_dots(shape=0,size=2)
我知道可以通过映射/循环来缓解这种情况,但是色标会更成问题且更困难。有没有一种方法可以根据列值获得正确的打开形状?
答案 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))