Добавить легенду в геопанды - PullRequest
0 голосов
/ 15 октября 2019

У меня есть карта Чили (http://labgeo.ufro.cl/fichas/chile_geo/ficha_cl_geo.html первая ссылка, на которой написано «Континентальный Чили»), и я хотел бы построить ее и добавить несколько точек центров, для которых у меня есть данные широты и долготы.

Я новичок с геопандами и matplotlib, но мне удалось построить карту с центрами в виде точек разных цветов, используя предложенный ответ для matplotlib из этого поста: Цвет по значениям столбцов в Matplotlib

Вот мой код:

#Loading data, since I am making the coordinates up they won´t fit the map nicely but you will get the idea

map_= gpd.read_file("cl_continental_geo.shp")
geo_df_ = pd.DataFrame({"id":np.random.randint(20, size=133) ,"Latitude": np.random.normal(-34.406922,7.819504, 133), "Longitud": np.random.normal(-71.243350,1.254126, 133)})

geometry =[Point(xy) for xy in zip( geo_df_["Longitud"],geo_df_["Latitude"])]
geo_df_ =gpd.GeoDataFrame(geo_df_, crs={"init":"epsg:4326"},geometry= geometry)

# creating color map for categories
categories = np.unique(geo_df_["id"])
colors = np.linspace(0, 1, len(categories))
colordict = dict(zip(categories, colors))

#matching it to the geopandas df
geo_df_["Color"] = geo_df_["id"].apply(lambda x: colordict[x])

#plotting    
geo_df_.plot(ax=map_.plot(figsize=(40, 30)), marker='o', c =geo_df_.Color, markersize=100)

То, что я не могу сделать, пробуя разные вещи, - это появление легенды.

  • Я попытался добавить легенду = True
  • Я попытался сделать это сначала путем определения топора, но мне не удается правильно передать данные, чтобы создать график и ничего не получилось.
  • Пробовал это решение, но мой файл shp содержит только одну строку синформация о мультиполигоне, и я не знаю, как создать предложенный скрещенный фрейм данных Создание легенды для сюжета геопанды

Пока единственное, что мне удалосьdo показывает словарь идентификаторов с номером цвета, добавляя .legend () в конце, как это: geo_df_.plot(ax=map_.plot(figsize=(40, 30)), marker='o', c =geo_df_.Color, markersize=100).legend(). Но я получаю эту ошибку

Не найдены дескрипторы с метками для вставки в легенду.

, но когда я передаю словарь цветов в качестве аргумента, он показывает одну точку вЛегенда.

То, что я хотел бы достичь, это легенда, как это:

enter image description here

взяты из этого поста: КонтрольВнешний вид легенды ggplot2, не затрагивающий сюжет Моя идеальная легенда - иметь квадрат на стороне со всеми цветными точками, отождествленными с идентификатором центра, который они представляют. Например, желтая точка: (в центре) 5, фиолетовая точка: 8 и т. Д.

У меня есть только одна точка, которая показывает весь словарь следующим образом:

example of part of the map with the dictionary legend

1 Ответ

0 голосов
/ 15 октября 2019

Не используйте c, но column. И тогда legend=True сделает трюк, чтобы показать легенду, а categorical=True даст вам то, что вы хотите. В этом конкретном случае у вас может не хватить цветов, поэтому вам придется установить другую цветовую карту, если вы хотите, чтобы все цвета отличались (cmap='')

map_= gpd.read_file("/Users/martin/Downloads/cl_continental_geo/cl_continental_geo.shp")
geo_df_ = pd.DataFrame({"id":np.random.randint(20, size=133) ,"Latitude": np.random.normal(-34.406922,7.819504, 133), "Longitud": np.random.normal(-71.243350,1.254126, 133)})

geometry =[Point(xy) for xy in zip( geo_df_["Longitud"],geo_df_["Latitude"])]
geo_df_ =gpd.GeoDataFrame(geo_df_, crs={"init":"epsg:4326"},geometry= geometry)

# creating color map for categories
categories = np.unique(geo_df_["id"])
colors = np.linspace(0, 1, len(categories))
colordict = dict(zip(categories, colors))

#matching it to the geopandas df
geo_df_["Color"] = geo_df_["id"].apply(lambda x: colordict[x])

#plotting    
ax = map_.plot(figsize=(40, 30))
geo_df_.plot(ax=ax, marker='o', column='id', categorical=True,
             markersize=100, legend=True, cmap='tab20')

enter image description here

...