У меня есть данные, связанные с тибблом, для диаграммы рассеяния и карты, которая должна взаимодействовать через 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)