r - 在基组之间切换时是否可以在多个图例之间切换?

标签 r leaflet r-leaflet

我正在使用r中的传单来可视化一些矢量数据,其中包含用户可能感兴趣的多个非空间变量。我想允许用户选择一个确定要素颜色的变量。我通过baseGroups函数的addLayersControl参数来完成此操作,其中每个组都是具有不同调色板的相同数据。这对于切换功能部件本身的颜色效果很好,但不允许我在图例之间进行切换-即使我在group中使用适当的addLegend,也会始终显示添加的每个图例。请参见下面的示例代码和屏幕截图:

data <- data.frame(long = c(-93.2, -93, -93.5), lat = c(44.9, 45, 44.9), 
               var1 = c(1,2,3), var2 = c(10, 9, 1))

pal1 <- colorNumeric(palette = "Blues", domain = data$var1)
pal2 <- colorNumeric(palette = "Reds", domain = data$var2)

leaflet(data) %>%
  addCircleMarkers(color = ~pal1(var1), group = "var1") %>%
  addCircleMarkers(color = ~pal2(var2), group = "var2") %>%
  addLegend(pal = pal1, values = ~var1, group = "var1") %>%
  addLegend(pal = pal2, values = ~var2, group = "var2") %>%
  addLayersControl(baseGroups = c("var1", "var2"), position = "topleft")




如果在图层控件中将baseGroups替换为overlayGroups,这将按预期工作,并且仅显示所选组的图例。但是,此选项并不理想,因为我不希望用户能够选择多个组或取消选择所有组。

enter image description here

These questions与我的非常相似,但是接受的解决方案都使用overlayGroups,而我想坚持使用baseGroups。如果可能的话,我也希望避免使用光泽。

最佳答案

似乎baseGroups中的图例不会像在overlayGroups中那样被删除/重新添加,即使调用hideGroup("var1")后,图例的持久性也可以进一步证明。

粗略的解决方法可能是添加事件处理程序,以使用baseGroups作为键根据当前选定的group = "<groupName>"组来隐藏/取消隐藏图例,而无需进行其他任何更改。例如:

htmlwidgets::onRender("
    function(el, x) {
      var updateLegend = function () {
          var selectedGroup = document.querySelectorAll('input:checked')[0].nextSibling.innerText.substr(1);

          document.querySelectorAll('.legend').forEach(a => a.hidden=true);
          document.querySelectorAll('.legend').forEach(l => {
            if (l.children[0].children[0].innerText == selectedGroup) l.hidden=false;
          });
      };
      updateLegend();
      this.on('baselayerchange', e => updateLegend());
    }")


演示版

demo of workaround

演示来源

require(leaflet)


data <- data.frame(long = c(-93.2, -93, -93.5), lat = c(44.9, 45, 44.9), 
                   var1 = c(1,2,3), var2 = c(10, 9, 1))

pal1 <- colorNumeric(palette = "Blues", domain = data$var1)
pal2 <- colorNumeric(palette = "Reds", domain = data$var2)

leaflet(data) %>%
  addCircleMarkers(color = ~pal1(var1), group = "var1") %>%
  addCircleMarkers(color = ~pal2(var2), group = "var2") %>%
  addLegend(pal = pal1, values = ~var1, group = "var1") %>%
  addLegend(pal = pal2, values = ~var2, group = "var2") %>%
  addLayersControl(baseGroups = c("var1", "var2"), 
                   position = "topleft",
                   options = layersControlOptions(collapsed=F)) %>%
  htmlwidgets::onRender("
    function(el, x) {
      var updateLegend = function () {
          var selectedGroup = document.querySelectorAll('input:checked')[0].nextSibling.innerText.substr(1);

          document.querySelectorAll('.legend').forEach(a => a.hidden=true);
          document.querySelectorAll('.legend').forEach(l => {
            if (l.children[0].children[0].innerText == selectedGroup) l.hidden=false;
          });
      };
      updateLegend();
      this.on('baselayerchange', e => updateLegend());
    }")

关于r - 在基组之间切换时是否可以在多个图例之间切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393310/

相关文章:

r - 在 R 中返回函数的函数

r - 如何使用 Shiny 的传单将多段线从一个位置分别添加到其他位置?

传单抽奖 : differentiating between multiple controls

r - 传单 map 防止浏览器滚动

r - 更改传单中addLayersControl的图

python - 在 pandas 列上操作时避免重复数据框名称

r - 在 heatmap.2 函数中更改标题字体大小?

r - 在 R : calculate Area Under Precision/Recall Curve (AUPR)?

javascript - 使用 geoJson 数据在传单弹出窗口中制作图表

R Leaflet层控制与easybutton