Поведение tmap tm_dots в пользовательском столбце формы - PullRequest
0 голосов
/ 25 июня 2019
Кажется, что у

точек 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 Ответ

1 голос
/ 25 июня 2019

Я не tmap эксперт, но, похоже, это недоразумение.

В документации говорится об аргументе shape:

форма (и) символа.Либо прямая спецификация (и) формы, либо имя (я) переменной данных, которые отображаются на символы, указанные аргументом фигур.Подробности смотрите в спецификации формы.

А об аргументе shapes говорится:

палитра форм символов.Применяется только в том случае, если форма является (вектором) категориальной (ых) переменной (ей).Смотрите подробности для спецификации формы.По умолчанию используются заполненные символы с 21 по 25.

Поэтому, когда вы делаете shape = 0, вы выполняете прямую спецификацию формы.Вот почему это работает.Когда вы используете имя переменной, вам необходимо сопоставить ее категории с shapes -аргументом.Вы не делаете этого, поэтому требуется 21 и 22, которые являются его формами по умолчанию, и они заполнены квадратом и заполненным кругом.

Вот как у меня это работало:

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