import folium
m = folium.Map()
m = add_categorical_legend(m, 'My title',
colors = ['#000','#03cafc'],
labels = ['Heat', 'Cold'])
m = add_categorical_legend(m, 'My title 2',
colors = ['#F23','#777'],
labels = ['Heat 2', 'Cold 2'])
m.save("map.html")
m
Результат
Проблемы
Однако легенда, которую я создал, конфликтует с элементами управления слоями folium, и они перестают работать, что для меня является очень большой проблемой, потому что легенды предназначены для описания того, что я я использую в LayerControls. Я не знаю, в чем причина.
Кроме того, это работает только для категориальных данных.
Важно
Я бы хотел, чтобы легенды можно было добавлять вверх | бот и право | левые позиции, как это делает addLegend из R. Указание абсолютного положения невозможно.
Любая помощь приветствуется
ПРИМЕЧАНИЕ. Я не хочу использовать карту цветов Бранка, потому что мне бы хотелось иметь легенду, подобную той, что показана вам на изображениях.
Я хотел бы добавить категориальную/числовую легенду к карте листа, как это делает addLenged() из R. Примеры: Цифровая легенда [img]https://i.sstatic.net/G6lwW.png[/img]
Я также хотел бы добавить категориальная легенда, такая как эта: Категорическая легенда [img]https://i.sstatic.net/fNDBo.png[/img]
Пока у меня есть только этот код, я застрял, пытаясь достичь того, что делает addLegend из R. Функция [code]def add_categorical_legend(folium_map, title, colors, labels): if len(colors) != len(labels): raise ValueError("colors and labels must have the same length.")
color_by_label = dict(zip(labels, colors))
legend_categories = "" for label, color in color_by_label.items(): legend_categories += f"[*]{label}"
legend_html = f"""
{title}
[list] {legend_categories} [/list]
""" script = f"""
var oneTimeExecution = (function() {{ var executed = false; return function() {{ if (!executed) {{ var checkExist = setInterval(function() {{ if ((document.getElementsByClassName('leaflet-top leaflet-right').length) || (!executed)) {{ document.getElementsByClassName('leaflet-top leaflet-right')[0].style.display = "flex" document.getElementsByClassName('leaflet-top leaflet-right')[0].style.flexDirection = "column" document.getElementsByClassName('leaflet-top leaflet-right')[0].innerHTML += `{legend_html}`; clearInterval(checkExist); executed = true; }} }}, 100); }} }}; }})(); oneTimeExecution()
return folium_map [/code] Воспроизводимый пример [code]import folium m = folium.Map()
m = add_categorical_legend(m, 'My title', colors = ['#000','#03cafc'], labels = ['Heat', 'Cold']) m = add_categorical_legend(m, 'My title 2', colors = ['#F23','#777'], labels = ['Heat 2', 'Cold 2']) m.save("map.html") m [/code] Результат [img]https://i.sstatic.net/3Tm9A.png[/img]
Проблемы [list] [*]Однако легенда, которую я создал, конфликтует с элементами управления слоями folium, и они перестают работать, что для меня является очень большой проблемой, потому что легенды предназначены для описания того, что я я использую в LayerControls. Я не знаю, в чем причина. [*]Кроме того, это работает только для категориальных данных. [/list] Важно [list] [*]Я бы хотел, чтобы легенды можно было добавлять вверх | бот и право | левые позиции, как это делает addLegend из R. Указание абсолютного положения невозможно. [/list] Любая помощь приветствуется ПРИМЕЧАНИЕ. Я не хочу использовать карту цветов Бранка, потому что мне бы хотелось иметь легенду, подобную той, что показана вам на изображениях.