Цвет точки и размер символа на основе разных переменных в просмотре карты - PullRequest
2 голосов
/ 24 июня 2019

Я пытаюсь использовать тему дивергентного масштаба в картографическом представлении, чтобы помочь визуализировать прибыль или убыток, с:

  • размеры окружностей в точечном символе по шкале абсолютных значений (чтобы выделить как потери, так и выгоды)
  • расходящаяся цветовая шкала для кружков (скажем, темно-синий> синий> белый> красный> темно-красный для большинства негативов> негатив> ноль> позитив> наибольший)
  • указатель мыши при наведении на указатель исходного значения сохраняется

есть идеи?


library(tidyverse)
library(mapview)
library(sf)

lat <- rep(34,16)
lon <- seq(-128, -126, length = 16)
value <- c(-1000, -800, -600, -400, -200, -100, -50, 
            -25, 25, 50, 100, 200, 400, 600, 800, 1000)

#make data.frame
df <- data.frame(lat, lon, value) 

#make spatial object for mapview
df <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326) %>%
      mutate(value_abs = abs(value)) #value_abs intended for `cex` argument

pal <-  mapviewPalette("mapviewSpectralColors") #from mapview doc. example
m   <-  mapview(df["value"], #sets hover over value as this column
         cex = "value",      #sets circle diameter scaling on this column
         legend = TRUE,
         col.regions = pal(100), #closest I found to a red-blue divergent scale
         layer.name = "value")  
m

Другими словами, я надеюсь, что рисунок точек ниже будет симметричным с левой стороны как зеркальное отображение правого размера, но с синими кругами слева, красным справа и все еще позволяющим пользователь может видеть фактические (не абсолютные) значения (например, -1000) при наведении мыши.

enter image description here

попытки: переключение cex = "value" с cex = "value_abs" дает warning: In min(x) : no non-missing arguments to min; returning Inf без каких-либо нарисованных точек или cex = df$value_abs (без кавычек), что дает неокрашенные, огромные точки. Я не планирую нуждаться в двух легендах - просто одна для размера круга или заполнения, показывающая минимальное и максимальное значение, как сейчас, была бы отличной.

1 Ответ

0 голосов
/ 25 июня 2019

Вы очень близки. Вам необходимо явно сослаться на df$value_abs. Смотрите ниже:

library(tidyverse)
library(mapview)
library(sf)

df <- data.frame(lat=rep(34,16), 
                 lon=seq(-128, -126, length = 16), 
                 value=c(-1000, -800, -600, -400, -200, -100, -50, 
                         -25, 25, 50, 100, 200, 400, 600, 800, 1000)) 

df <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326) %>%
               mutate(value_abs = abs(value))

pal <-  mapviewPalette("mapviewSpectralColors")

mapview(df["value"], 
                cex = df$value_abs/100, 
                legend = TRUE,
                col.regions = pal(100), 
                layer.name = "value")  

Создано в 2019-06-24 пакетом Представления (v0.3.0)

...