向 Folium 地图添加色彩图例

问题描述 投票:0回答:2

我正在尝试在 Folium 中制作一个具有多个图层的地图,每个图层都由阴影区域(使用 GeoJSON)组成,其颜色由颜色图给出。我想向我的图层添加图例。我找到了第一个解决方案here,但这个解决方案的问题是图例固定在右上角,更重要的是,它总是在那里。相反,我想要一个仅在显示相应图层时才显示的图例。

这是我尝试过的一些示例代码(其中 m 是我的 Folium 贴图,cm1 和 cm2 是彩色贴图):

folium.GeoJson(data['Temp'],
    name='Temp',
    style_function=lambda x: {
            'fillColor': cm1(x['properties']['Temp']),
            'fillOpacity': 0.2,
            'color' : None
                            },
    highlight_function=lambda x: {'weight':3, 'color':'black'},
    tooltip=folium.features.GeoJsonTooltip(fields=['Temp', 'Rain'],
                                            labels=True,
                                            sticky=True
                                            ), show=False).add_to(m)

folium.GeoJson(data['Rain'],
    name='Rain',
    style_function=lambda x: {
            'fillColor': cm2(x['properties']['Rain']),
            'fillOpacity': 0.2,
            'color' : None
                            },
    highlight_function=lambda x: {'weight':3, 'color':'black'},
    tooltip=folium.features.GeoJsonTooltip(fields=['Temp', 'Rain'],
                                            labels=True,
                                            sticky=True
                                            ), show=False).add_to(m)

cm1.caption = 'Temp scale'
cm2.caption = 'Rain scale'
m.add_child(cm1)
m.add_child(cm2)

folium.LayerControl().add_to(m)

如何更改我的代码,以便仅在显示相应图层时才显示图例? (如果可能的话,我怎样才能将图例移到左下角?)

python visualization geospatial colormap folium
2个回答
0
投票

如果您只想更改 LayerControl 的位置:

folium.map.LayerControl('topleft', collapsed=False).add_to(m)

如果您了解一点 JavaScript,您可以更改/操作,例如: 传奇


0
投票

评论链接获得了解决方案的大部分内容!只需将

overlayadd
overlayremove
事件修改为
layeradd
layerremove
,这样当您使用互斥(overlay = False)层时,该解决方案也可以工作。

# Adapted from: https://nbviewer.org/gist/BibMartin/f153aa957ddc5fadc64929abdee9ff2e
from branca.element import MacroElement
from jinja2 import Template

class BindColormap(MacroElement):
    """Binds a colormap to a given layer.

    Parameters
    ----------
    colormap : branca.colormap.ColorMap
        The colormap to bind.
    """
    def __init__(self, layer, colormap):
        super(BindColormap, self).__init__()
        self.layer = layer
        self.colormap = colormap
        self._template = Template(u"""
        {% macro script(this, kwargs) %}
            {{this.colormap.get_name()}}.svg[0][0].style.display = 'block';
            {{this._parent.get_name()}}.on('layeradd', function (eventLayer) {
                if (eventLayer.layer == {{this.layer.get_name()}}) {
                    {{this.colormap.get_name()}}.svg[0][0].style.display = 'block';
                }});
            {{this._parent.get_name()}}.on('layerremove', function (eventLayer) {
                if (eventLayer.layer == {{this.layer.get_name()}}) {
                    {{this.colormap.get_name()}}.svg[0][0].style.display = 'none';
                }});
        {% endmacro %}
        """)  # noqa

# set up base map
map = folium.Map(tiles=None)
layer0 = folium.FeatureGroup(name='Base Map',overlay=True,control=False)
folium.TileLayer(tiles='OpenStreetMap').add_to(layer0)
layer0.add_to(map)

# imagine you've already defined two layers and associated colorbars
# call them layer1, colorbar1; layer2, colorbar2
map.add_child(colorbar1)
map.add_child(BindColormap(layer1,colorbar1))
map.add_child(colorbar2)
map.add_child(BindColormap(layer2,colorbar2))

folium.LayerControl(collapsed=False).add_to(test_map)
© www.soinside.com 2019 - 2024. All rights reserved.