Невозможные точки цветового кода на карте GeoPanda с контекстной фоновой картой - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь создать Карту, в которой есть точки, которые имеют цветовую кодировку по категории - однако, когда я раскрашиваю по категориям, индекс включается в категорию, поэтому каждая точка имеет свой собственный цвет. Вот пример кода для воссоздания моей проблемы.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib import cm
import geopandas as gpd
from shapely.geometry import Point
import contextily as ctx

list = [[39.17413494, -84.36475604, 'BK'],
 [38.96151336, -84.55732482, 'McDonalds'],
 [38.95100498, -84.55013050000001, 'McDonalds'],
 [38.96186501, -84.55717946, 'McDonalds'],
 [39.00969774, -84.50139703, 'Subway'],
 [39.09614656, -84.56445953, 'Pizza Hut'],
 [38.98661028, -84.39965444, 'Popeyes'],
 [39.34727542, -84.66033389, 'Arbys'],
 [39.09854089, -84.55881323, 'Wendys'],
 [39.0985409, -84.55881323, 'Subway'],
 [38.98693673, -84.39936496, 'Starbucks'],
 [39.17663372, -84.66664250000001, 'ChickFilA'],
 [39.19368097, -84.67709306, 'Subway'],
 [39.202496000000004, -84.5474509, 'Starbucks'],
 [39.202496000000004, -84.5474509, 'Starbucks'],
 [39.05680444, -84.32690772, 'BK'],
 [39.049786100000006, -84.39536650000001, 'McDonalds'],
 [39.049786100000006, -84.39536650000001, 'McDonalds'],
 [39.049786100000006, -84.39536650000001, 'McDonalds'],
 [39.049786100000006, -84.39536650000001, 'Subway'],
 [39.049786100000006, -84.39536650000001, 'Pizza Hut'],
 [39.04982251, -84.39533805, 'Popeyes'],
 [39.04982249, -84.39533811, 'Arbys'],
 [39.04982581, -84.39533835, 'Wendys'],
 [39.04982419, -84.39533558, 'Subway'],
 [39.04982533, -84.39534599, 'Starbucks'],
 [39.04982604, -84.39534769, 'ChickFilA'],
 [39.356410100000005, -84.361086, 'Subway'],
 [39.18283407, -84.38227921, 'Starbucks'],
 [39.43731072, -84.26926351, 'Starbucks']]
data = pd.DataFrame(list, columns =['Lat', 'Long', 'Type']) 

geometry = [Point(xy) for xy in zip(data['Long'], data['Lat'])]
crs = {'init':'epsg:4326'}
gdf = gpd.GeoDataFrame(data, crs=crs, geometry=geometry)

cmap = plt.cm.get_cmap('Dark2', 9)

gdf = gdf.to_crs(epsg=3857)
ax = gdf.plot(c=gdf.Type, cmap=cmap, label=gdf.Type, figsize=(10,10), alpha=.5)
ctx.add_basemap(ax, url=ctx.providers.Stamen.TonerLite)
ax.set_axis_off()
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

В результате получается следующее изображение:

enter image description here

Как вы можетесм. каждый «Макдональдс» имеет свой собственный цвет, а легенда перечисляет каждую точку данных.

1 Ответ

1 голос
/ 02 октября 2019

Вы используете неверные атрибуты для графика. Geopandas (по крайней мере, в последних версиях) нужно column, а не c.

ax = gdf.plot(column=gdf.Type, cmap=cmap, label=gdf.Type, figsize=(10,10), alpha=.5)

Кажется, это работает. Но вы должны знать, что у вас есть несколько перекрывающихся точек, поэтому они не всегда выглядят одинаково.

РЕДАКТИРОВАТЬ: чтобы иметь правильную легенду, вам нужно использовать Geopandas, чтобы нарисовать ее и передать legend_kwds Geopandas plot:

ax = gdf.plot(column=gdf.Type, cmap=cmap, label=gdf.Type,
              figsize=(10,10), alpha=.5, legend=True,
              legend_kwds={'loc': 'center left', 'bbox_to_anchor': (1, 0.5)})
ctx.add_basemap(ax, url=ctx.providers.Stamen.TonerLite)
ax.set_axis_off()
...