Настройте выделение между графической фигурой и картой листовки

avatar
greengrass62
1 июля 2021 в 20:59
170
0
6

Моя цель состоит в том, чтобы связать подсветку между сюжетной фигурой на одной панели и картой на второй панели. Для моих целей я хочу выбрать (выделить) данные на одной панели и выделить выбранные данные красным цветом на обеих панелях, а не затемнить невыбранные данные. Это должно работать независимо от того, какая панель используется для выбора данных. Ниже у меня есть два подхода, каждый из которых выделяет данные между двумя панелями, но имеет цвет выделения, а затемнение имеет проблемы с функциональностью.

Подход A: В этом подходе я сопоставляю листовку, чтобы избежать мапбокса. Я также использую mode ='markers+lines', так как в моих реальных данных точки данных расположены очень близко друг к другу по оси x, и соединение данных линией визуально полезно, хотя это создает проблему с функциональностью, которую я описываю ниже в коде.

library(plotly)
library(dplyr)
library(leaflet)
library(htmlwidgets)
library(crosstalk)

set.seed(1)
dat <- tibble(name = letters[1:21]
              , latitude = seq(38.6,38.8,0.01)
              , longitude = seq(-86.4,-86.8,-0.02)
              , var.x = 1:21
              , var.y = runif(21))

dat.a <- highlight_key(dat)

p <- plot_ly(dat.a) %>%
  add_trace(x = ~var.x, y = ~var.y
            , text = ~name
            , alpha = 0.8
            , mode = 'markers+lines', type = 'scatter'
            , color = I("#1f77b4")
            , showlegend = FALSE) %>%
  highlight(on = "plotly_selected"
            , off = "plotly_deselect"
            , opacityDim = 1
            , color='red') 

map <- leaflet(dat.a) %>%    
  addTiles() %>%
  # addProviderTiles(providers$CartoDB.Positron) %>%
  addCircles(lat = ~latitude
             , lng = ~longitude
             , stroke = TRUE
             , color = I("#1f77b4")
             , weight = 3
             , opacity = .8) %>%
  highlight(on="plotly_selected")

bscols(widths = c(5, 7)
       , p, map)

Подход A комментарии: На приведенном ниже снимке экрана я выбрал 4 точки данных на рисунке (левая панель), где y<=0,2. Проблема 1: правильные точки на карте (правая панель) выбраны, но в выделенных точках (на карте) остаются синими, а невыбранные точки тусклыми. Проблема 2: после выбора рисунок (левая панель) добавляет красную линию между точками, когда var.x= 5 и var.x=10. (Приемлемо решение проблемы 2, заключающееся только в выделении символов, а не линий на рисунке (левая панель)).

Solution A issue

Подход B: В этом подходе я сопоставляю с графиком, что хорошо из-за более продвинутых функций выбора на карте

library(plotly)
library(dplyr)
library(htmlwidgets)
library(crosstalk)

set.seed(1)
dat <- tibble(name = letters[1:21]
              , latitude = seq(38.6,38.8,0.01)
              , longitude = seq(-86.4,-86.8,-0.02)
              , var.x = 1:21
              , var.y = runif(21))

dat.a <- highlight_key(dat)

p <- plot_ly(dat.a) %>%
  add_trace(x = ~var.x, y = ~var.y
            , type = "scatter"
            , text = ~name
            , alpha = 0.8
            , mode = 'lines+markers'
            , color = I("#1f77b4")
            , showlegend = FALSE) %>%
  highlight(on = "plotly_selected"
            , off = "plotly_deselect"
            , opacityDim = 1
            , color = 'red')

map <- plot_ly(dat.a) %>% 
  add_trace(lon = ~longitude, lat = ~latitude
          , type = "scattermapbox"
          , text = ~name
          , alpha = 0.8
          , mode = "marker"
          , color = I("#1f77b4")
          , hoverinfo = ~name) %>%
  # Plot the data again but using the original data
  add_trace(lon = ~longitude, lat = ~latitude
            , data = dat
            , type = "scattermapbox"
            , text = ~name
            , alpha = 0.8
            , mode = "markers"
            , color = I("#1f77b4")
            , showlegend = FALSE) %>%
  layout(
    mapbox = list(
      style = 'open-street-map',
      zoom = 8.5,
      center = list(lon = mean(dat$longitude), 
                    lat = mean(dat$latitude)))) %>%
  highlight(on = "plotly_selected"
            , off = "plotly_deselect"
            , color = 'red')

bscols(p, map, widths = c(5, 7))

Комментарии к подходу B: При выполнении кода выбор данных на рисунке (левая панель) правильно выделяет данные на карте (правая панель) — похоже, это работает постоянно. Проблема 1: при первом запуске кода выбор данных на карте (правая панель) правильно выделяет данные на рисунке (левая панель) в первый раз. Последующие выборки из результата карты не окрашиваются в желаемый красный цвет, а также затемняют невыбранные точки. Проблема 2 (такая же, как и проблема 2 подхода A): после выбора на рисунке (левая панель) добавляется красная линия между точками, как var.x= 5 и var.x=10. (Приемлемо решение проблемы 2, заключающееся только в выделении символов, а не линий на рисунке (левая панель)).

Solution B issues

Мои вопросы («проблемы»), с которыми мне нужна помощь, как указано в комментариях к подходу A и B:

Для подхода A: Я ищу изменения в моем коде, которые будут 1) выделять точки красным цветом на левой панели без добавления красной соединительной линии и 2) выделять точки красным цветом на правой панели, а не затемнять другие точки.

Для подхода B: я ищу изменения, которые позволят последовательно выделять точки на карте красным цветом (похоже, это работает нормально в первый раз, но не повторно, и 2) не соединять точки на графике красной линией, т.е. просто выделите точки).

Источник
phalteman
11 февраля 2022 в 17:52
0

Можете ли вы уточнить, есть ли здесь вопрос, на который нужно ответить?

greengrass62
13 марта 2022 в 12:08
0

@phalteman … обновлено, чтобы указать вопросы в конце исходного сообщения

Ответы (0)