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

Joe*_*Joe 13 r leaflet r-leaflet

我正在使用r中的传单可视化一些矢量数据,其中包含用户可能感兴趣的多个非空间变量。我想允许用户选择一个确定要素颜色的变量。我通过函数的baseGroups参数来完成此操作addLayersControl,其中每个组都是具有不同调色板的相同数据。这工作正常切换的特征本身的颜色,但不允许我之间legends-每一个传说我添加始终显示切换,即使我使用适当的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")
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

Qua*_*uar 7

似乎传说 inbaseGroups不会像in那样删除/重新添加,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());
    }")
Run Code Online (Sandbox Code Playgroud)

演示

解决方法演示

演示来源

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());
    }")
Run Code Online (Sandbox Code Playgroud)

  • 这非常有帮助但很脆弱。JS代码要求图例标题与图层控件中的名称完全一致。这很容易被破坏,例如,如果您为图例指定标题。 (3认同)
  • 这个答案很好,但如果将传单对象输出到使用选项卡的 r markdown 文档,它似乎不起作用。 (2认同)
  • @g07kore 是的,它更容易,PO 知道这种方法,但正如 PO 所说“这个选项并不理想,因为我不希望用户能够选择多个组或取消选择所有组”。 (2认同)