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。如果可能的话,我也希望避免使用光泽。
似乎传说 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)