如何在 folium 上基于 PolyLine 进行颜色

P. *_*lin 5 python data-visualization folium

我尝试使用 folium 根据速度(就像 Strava 等应用程序一样)使用不同颜色的比赛路径。

我看到您可以根据数据更改标记的颜色,但我无法使用折线对其进行转置。

这是我的可视化代码:

points = []
for track in gpx.tracks:
    for segment in track.segments:        
        for point in segment.points:
            points.append(tuple([point.latitude, point.longitude]))

ave_lat = sum(p[0] for p in points)/len(points)
ave_lon = sum(p[1] for p in points)/len(points)

my_map = folium.Map(location=[ave_lat, ave_lon], zoom_start=13)
folium.PolyLine(points, color="red", weight=2.5, opacity=1).add_to(my_map)
Run Code Online (Sandbox Code Playgroud)

我还有一个带有经度、纬度和速度的数据框,我希望线条根据速度改变颜色。

小智 7

大叶有 ColorLine :

folium.ColorLine(
        positions = segments, # tuple of coordinates 
        colors = speed, # map each segment with the speed 
        colormap =  colormap, # map each value with a color 
        ).add_to(base)
Run Code Online (Sandbox Code Playgroud)

  • 我尝试通过“import matplotlib”和“colormap = matplotlib.cm.Reds”指定颜色图,但这似乎不起作用。什么是“色彩图”? (3认同)

Ste*_*del 3

PolyLine 函数没有内置方法可以为您执行此操作。颜色参数需要一个字符串值:“red”或“#FF0000”。因此,我知道的最简单的方法是创建一个字典,以舍入速度作为键,以所需的颜色十六进制代码作为值:

给定一个包含坐标的数据框:

>>> coordinates = {'lat':[52.354, 52.081, 52.384], 'lng':[4.903, 5.099, 4.643]}
>>> df = pd.DataFrame(data=coordinates, index=['Amsterdam', 'Utrecht', 'Haarlem'])
>>> df
              lat    lng
Amsterdam  52.354  4.903
Utrecht    52.081  5.099
Haarlem    52.384  4.643
Run Code Online (Sandbox Code Playgroud)

以及包含这些之间的速度的字典:

>>> dict_speed = {}
>>> cities_all = df.index.to_list()
>>> 
>>> for origin in df.index:
...     dict_speed[origin] = {
...         desti: np.random.uniform(3, 30) for desti in cities_all if origin != desti
...     }
...     cities_all.remove(origin)
... 
>>> dict_speed
{'Amsterdam': {'Utrecht': 11.17300608896625, 'Haarlem': 28.078139459927645},
 'Utrecht': {'Haarlem': 17.07939077211872},
 'Haarlem': {}}
Run Code Online (Sandbox Code Playgroud)

最后的成分:使用此链接为我们提供给定速度所需颜色的映射字典(http://blogs.perl.org/users/ovid/2010/12/perl101-red-to-green-gradient.html):

list_colors = [
    "#00FF00",
    "#12FF00",
    "#24FF00",
    "#35FF00",
    "#47FF00",
    "#58FF00",
    "#6AFF00",
    "#7CFF00",
    "#8DFF00",
    "#9FFF00",
    "#B0FF00",
    "#C2FF00",
    "#D4FF00",
    "#E5FF00",
    "#F7FF00",
    "#FFF600",
    "#FFE400",
    "#FFD300",
    "#FFC100",
    "#FFAF00",
    "#FF9E00",
    "#FF8C00",
    "#FF7B00",
    "#FF6900",
    "#FF5700",
    "#FF4600",
    "#FF3400",
    "#FF2300",
    "#FF1100",
    "#FF0000",
]
color_dict = {i: list_colors[i] for i in range(len(list_colors))}
Run Code Online (Sandbox Code Playgroud)

和绘图代码:

my_map = folium.Map(
    location=[np.mean(df["lat"].values), np.mean(df["lng"].values)],
    zoom_start=7,
    tiles="Stamen Terrain",
)

for city, row in df.iterrows():
    folium.Marker([row["lat"], row["lng"]], tooltip=city).add_to(my_map)

for origin, _ in dict_speed.items():
    for desti, speed in _.items():
        folium.PolyLine(
            (df.loc[origin].values, df.loc[desti].values),
            color=color_dict[round(speed)],
        ).add_to(my_map)

my_map
Run Code Online (Sandbox Code Playgroud)

您将获得一张大叶地图,其中颜色指示速度!

>>> coordinates = {'lat':[52.354, 52.081, 52.384], 'lng':[4.903, 5.099, 4.643]}
>>> df = pd.DataFrame(data=coordinates, index=['Amsterdam', 'Utrecht', 'Haarlem'])
>>> df
              lat    lng
Amsterdam  52.354  4.903
Utrecht    52.081  5.099
Haarlem    52.384  4.643
Run Code Online (Sandbox Code Playgroud)