R / Crosstalk: как одна точка на графике рассеяния может ссылаться на две точки на листовой карте? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть данные, связанные с тибблом, для диаграммы рассеяния и карты, которая должна взаимодействовать через crosstalk. Каждая точка на диаграмме рассеяния (x = расстояние, y = diff_fact) относится к паре двух местоположений (уникальный 'pair_indicator', school_1_lat, school_1_long, school_2_lat, school_2_long).

head (df_main)

#> # A tibble: 6 x 7
#>   pair_indicator school_1_lat school_2_lat school_1_long school_2_long distance
#>   <chr>                 <dbl>        <dbl>         <dbl>         <dbl>    <dbl>
#> 1 902021-902071          48.2         48.2          16.4          16.4     475.
#> 2 902031-902071          48.2         48.2          16.4          16.4     379.
#> 3 902031-902091          48.2         48.2          16.4          16.4     204.
#> 4 902081-902101          48.2         48.2          16.4          16.4     396.
#> 5 902081-902241          48.2         48.2          16.4          16.4     317.
#> 6 902101-902241          48.2         48.2          16.4          16.4     390.
#> # ... with 1 more variable: diff_factor <dbl>

Идея состоит в том, что, когда я щелкаю одну точку на диаграмме рассеяния, оба местоположения соответствующей пары выделяются на карте листовки с помощью crosstalk. К сожалению, приведенный ниже код не работает. Выбор точки на графике рассеяния не имеет никакого эффекта. Интересно, что если я изменю карту и покажу только одно местоположение (исключая другую часть пары), процесс выбора будет работать так, как задумано.

Есть идеи, как выделить оба местоположения? Большое спасибо.

library(crosstalk)
library(plotly)
library(leaflet)
library(leaflet.extras)

df_main <- structure(list(pair_indicator = c(
  "902021-902071", "902031-902071",
  "902031-902091", "902081-902101", "902081-902241", "902101-902241"
), school_1_lat = c(
  48.2149026, 48.2221631, 48.2221631, 48.2205238,
  48.2205238, 48.223532
), school_2_lat = c(
  48.2186668, 48.2186668,
  48.22407, 48.223532, 48.2231059, 48.2231059
), school_1_long = c(
  16.3876769,
  16.3848147, 16.3848147, 16.4049726, 16.4049726, 16.402895
), school_2_long = c(
  16.3853998,
  16.3853998, 16.3847968, 16.402895, 16.4063758, 16.4063758
), distance = c(
  475.2529684845,
  379.0377208616, 203.6641400739, 395.8339316511, 316.9061306841,
  390.1434258679
), diff_factor = c(
  1.96024763767, 2.27963849016,
  2.27354570637, 1.3, 1.57575757576, 1.21212121212
)), class = c(
  "tbl_df",
  "tbl", "data.frame"
), row.names = c(NA, -6L))

shared_df_main <- SharedData$new(df_main,
  # key=~pair_indicator,
  group = "pair_indicator"
) # creates shared object

# > scatter plotly --------------------------------------------------------
library(plotly)
plot_distance_diff <-
  plot_ly(
    data = shared_df_main,
    mode = "markers",
    type = "scatter"
  ) %>%
  add_trace(
    marker = list(color = "blue"),
    x = ~distance,
    y = ~diff_factor,
    showlegend = F
  )

# > map -------------------------------------------------------------------
# >> leaflet --------------------------------------------------------------
cross_map <- leaflet(
  data = shared_df_main,
  width = "100%",
  height = 400
) %>%
  addCircles(
    lat = ~school_1_lat,
    lng = ~school_1_long,
    # layerId = ~pair_indicator,
    color = "#008000"
  ) %>%
  addCircles(
    lat = ~school_2_lat,
    lng = ~school_2_long,
    # layerId = ~pair_indicator,
    color = "#FF0000"
  ) %>%
  addProviderTiles(providers$Stamen.TonerLite)

# > combine graphs -----------------------------------------------------------
crosstalk::bscols(plot_distance_diff, cross_map)

# Works; using only one location -------------------------------------------------------------------
cross_map_1 <- leaflet(
  data = shared_df_main,
  width = "100%",
  height = 400
) %>%
  addCircles(
    lat = ~school_1_lat,
    lng = ~school_1_long,
    # layerId = ~pair_indicator,
    color = "#008000"
  ) %>%
  addProviderTiles(providers$Stamen.TonerLite)

# > combine graphs -----------------------------------------------------------
crosstalk::bscols(plot_distance_diff, cross_map_1)



...