Plot colored polygons with geodataframe in folium

后端 未结 3 1240
被撕碎了的回忆
被撕碎了的回忆 2021-02-02 17:14

I\'m trying to plot radar data in folium, and I\'m almost there. I followed this example (Contour plot data (lat,lon,value) within boundaries and export GeoJSON) to get my data

相关标签:
3条回答
  • 2021-02-02 17:37

    I don't yet have enough reputation points to comment, so this is a separate answer to clarify the accepted answer written by edub.

    Matplotlib has the colors.to_hex() method already:

    import matplotlib.colors as cl
    
    colors = [cl.to_hex(c) for c in colors]
    

    This would replace the convert_to_hex() method in the accepted answer.

    0 讨论(0)
  • 2021-02-02 17:47

    Not an expert... I just started with folium and jupyter and had a similar problem but with lines. You say you have GeoJson and polygons and the color is included in the json I assume.

    The style_function might help you to get what you want?

    The example below is produced with this page: http://geojson.io/ All I had to do was a "mapping" with the style_function. It's also possible to use a self defined function, see: https://github.com/python-visualization/folium/blob/master/examples/Colormaps.ipynb

    import folium
    geoJsonData = {
        "features": [
            {
                "geometry": {
                    "coordinates": [
                        [
                            12.98583984375,
                            56.70450561416937
                        ],
                        [
                            14.589843749999998,
                            57.604221411628735
                        ],
                        [
                            13.590087890625,
                            58.15331598640629
                        ],
                        [
                            11.953125,
                            57.955674494979526
                        ],
                        [
                            11.810302734375,
                            58.76250326278713
                        ]
                    ],
                    "type": "LineString"
                },
                "properties": {
                    "stroke": "#fc1717",
                    "stroke-opacity": 1,
                    "stroke-width": 2
                },
                "type": "Feature"
            },
            {
                "geometry": {
                    "coordinates": [
                        [
                            14.9468994140625,
                            57.7569377956732
                        ],
                        [
                            15.078735351562498,
                            58.06916140721414
                        ],
                        [
                            15.4302978515625,
                            58.09820267068277
                        ],
                        [
                            15.281982421875002,
                            58.318144965188246
                        ],
                        [
                            15.4852294921875,
                            58.36427519285588
                        ]
                    ],
                    "type": "LineString"
                },
                "properties": {
                    "stroke": "#1f1a95",
                    "stroke-opacity": 1,
                    "stroke-width": 2
                },
                "type": "Feature"
            }
        ],
        "type": "FeatureCollection"
    }
    m = folium.Map(location=[ 56.7, 12.9], zoom_start=6)
    folium.GeoJson(geoJsonData,
        style_function=lambda x: {
            'color' : x['properties']['stroke'],
            'weight' : x['properties']['stroke-width'],
            'opacity': 0.6,
            'fillColor' : x['properties']['fill'],
            }).add_to(m)
    m
    

    The folium source code on git hub includes several nice examples as well:
    https://github.com/python-visualization/folium/tree/master/examples
    Here you find the options to play with:
    http://leafletjs.com/reference.html#path-options

    Hope this brings you forward!

    0 讨论(0)
  • 2021-02-02 17:58

    I think I figured it out. In my previous code, polygon.get_facecolor() returns a list of RGBA values ranging from 0-1. I added this function (modified from this post):

    def convert_to_hex(rgba_color) :
        red = str(hex(int(rgba_color[0]*255)))[2:].capitalize()
        green = str(hex(int(rgba_color[1]*255)))[2:].capitalize()
        blue = str(hex(int(rgba_color[2]*255)))[2:].capitalize()
    
        if blue=='0':
            blue = '00'
        if red=='0':
            red = '00'
        if green=='0':
            green='00'
    
        return '#'+ red + green + blue
    

    to convert it to a hex string. Then:

    gdf['RGBA'] = convert_to_hex(colors)
    

    Then to plot the colors in folium, I do:

    maploc = folium.Map(location=[42.377157,-71.236088],zoom_start=10,tiles="Stamen Toner")
    
    colors = []
    folium.GeoJson(
        gdf,
        style_function=lambda feature: {
            'fillColor': feature['properties']['RGBA'],
            'color' : feature['properties']['RGBA'],
            'weight' : 1,
            'fillOpacity' : 0.5,
            }
        ).add_to(maploc)
    

    and that created a really nice looking plot! (The property name is a bit misleading - it's not actually RGBA values, but hex strings.)

    0 讨论(0)
提交回复
热议问题