Как добавить маркеры легенды в Matplotlib?

Я хотел бы добавить легенду к моему графику Python с заголовком и маркерами легенды. Мои искренние извинения, как полный новичок в Python, я получил свой код из сообщения. Код ниже работает, но я хочу добавить легенду. Все графики, которые я гуглил, имеют дело с линейными графиками с несколькими линиями.

import geopandas as gpd
import matplotlib.pyplot as plt
from datetime import date
from mpl_toolkits.basemap import Basemap

map_df = gpd.read_file("../Shapefiles/lso_adm_fao_mlgca_2019/lso_admbnda_adm1_FAO_MLGCA_2019.shx")
risks_df=pd.read_csv("../Output/Wndrisks.csv")

merged_df = map_df.merge(risks_df, left_on=["ADM1_EN"], right_on=["District"])
d = {1: "green", 2: "yellow", 3: "orange", 4: "red"}
colors = map_df["ADM1_EN"].map(risks_df.set_index("District")["risk"].map(d))
ax = map_df.plot(color=colors, edgecolor = "k", alpha=0.7, legend=True, legend_kwds = {"label": "Risk Level", "orientation": "vertical"})

map = Basemap(projection='merc', llcrnrlon=26.5,llcrnrlat=-31.0,urcrnrlon=30.0,urcrnrlat=-28.5, epsg=4269)
map.drawlsmask(land_color='grey',ocean_color='aqua',lakes=True)

legend = plt.legend(handles=[one, two, three, four], title = "Risk Levels",
                loc=4, fontsize='small', fancybox=True)

plt.title(f"Strong Wind Risks 01-10Jun24", y=1.04)

plt.tick_params(
axis = "both",        # affect both the X and Y
which = "both",       # get rid of both major and minor ticks
top=False,          # get rid of ticks top/bottom/left/right
bottom=False,
left=False,
right=False,
labeltop=False,     # get rid of labels top/bottom/left/right
labelbottom=False,
labelleft=False,
labelright=False)

plt.axis("off")          # Get rid of the border around the map
plt.subplots_adjust(right=0.85) # Nudge the country to the left a bit

plt.savefig('wndriskmap.png', dpi=300)
plt.show()

Данные для формы:

"District","risk"
"Berea",3
"Butha-Buthe",4
"Leribe",4
"Mafeteng",4
"Maseru",4
"Mohale's Hoek",4
"Mokhotlong",4
"Qacha's Nek",4
"Quthing",4
"Thaba-Tseka",4

Сюжет я получаю в прикрепленном файле

При необходимости могу прикрепить шейп-файл. Я хочу, чтобы у легенды было название "Risk Level" и уровни 1=no risk, 2=low risk, 3=medium risk и 4=high risk. то, что я включил legend = plt.legend(...), не работает.

Помощь будет оценена по достоинству.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сопоставить риски с метками и построить categorical график :

from matplotlib.colors import ListedColormap

colors = {1: "green", 2: "yellow", 3: "orange", 4: "red"}  # or a list
labels = {1: "no risk", 2: "low risk", 3: "medium risk", 4: "high risk"}
catego = map_df["risk"].astype(str).str.cat(map_df["risk"].map(labels), sep = "- ")

fig, ax = plt.subplots(figsize=(5, 5))

map_df.plot(
    column=catego,
    categorical=True,
    edgecolor = "k",
    alpha=0.7,
    cmap=ListedColormap(colors.values()),
    legend=True,
    legend_kwds = {
        "title": "Risk Level",
        "shadow": True,
        "loc": "lower right",
    },
    ax=ax,
)
ax.set_axis_off()
ax.set_title("Strong Winds in 10-D Risks 01-10Jun")

Примечание: я использовал риски в качестве префикса/обходного решения, чтобы сохранить порядок меток в легенде.

Бесконечно благодарю @Timeless. Это именно то, что я ищу. Однако я не могу заставить код работать, я не уверен, какие строки удалить из моего исходного кода. Я действовал методом проб и ошибок и всегда получал ошибки. Буду признателен за дальнейшие рекомендации.

Zilore Mumba 07.07.2024 12:49

Пожалуйста. Какие ошибки вы получаете? Ваш полный код должен выглядеть так вот так.

Timeless 07.07.2024 13:02

Код, который вы дали, работает отлично. Еще раз большое спасибо

Zilore Mumba 07.07.2024 14:37

Привет @Timeless, надеюсь, я еще смогу с тобой связаться. Мне очень нравится изображение, полученное из сценария, но у меня есть проблема, и я не уверен, есть ли решение. Если у меня есть 3 уровня риска: 1, 2, 3, они должны быть зеленым, желтым и оранжевым, но у меня есть зеленый, желтый и красный. Аналогично, если у меня только 4-й уровень, я хочу красный, но получаю зеленый с легендой как высокий риск. Есть ли способ заставить цвета. Я буду признателен за ваше руководство.

Zilore Mumba 22.07.2024 18:36

Привет @ZiloreMumba, ты можешь заменить cmap=ListedColormap(colors.values()) на cmap=ListedColormap([c for r,c in colors.items() if r in map_df["risk"].unique()]). В приведенном вами примере у вас должно получиться вот это.

Timeless 22.07.2024 18:54

Большое спасибо @Timeless, все работает отлично. Я весьма признателен.

Zilore Mumba 22.07.2024 21:55

Другие вопросы по теме