Метод 1:
GeoPandas использует классификатор PySal .Вот пример карты квантилей (k = 5).
import matplotlib.pyplot as plt
import numpy as np
import pysal.viz.mapclassify as mc
import geopandas as gpd
# load dataset
path = gpd.datasets.get_path('naturalearth_lowres')
gdf = gpd.read_file(path)
# generate a random column
gdf['random_col'] = np.random.normal(100, 10, len(gdf))
# plot quantiles map
fig, ax = plt.subplots(figsize=(10, 10))
gdf.plot(column='random_col', scheme='quantiles', k=5, cmap='Blues',
legend=True, legend_kwds=dict(loc=6), ax=ax)
Это дает нам:
Предположим, что мы хотим округлить числа влегенда.Мы можем получить классификацию с помощью функции .Quantiles()
в pysal.viz.mapclassify
.
mc.Quantiles(gdf.random_col, k=5)
Функция возвращает объект classifiers.Quantiles
:
Quantiles
Lower Upper Count
==========================================
x[i] <= 93.122 36
93.122 < x[i] <= 98.055 35
98.055 < x[i] <= 103.076 35
103.076 < x[i] <= 109.610 35
109.610 < x[i] <= 127.971 36
Объект имеет атрибут bins
, который возвращает массив, содержащий верхние границы во всех классах.
array([ 93.12248452, 98.05536454, 103.07553581, 109.60974753,
127.97082465])
Таким образом, мы можем использовать эту функцию, чтобы получить все границы классов, так как верхняя граница в нижнем классе равна нижнемусвязаны в более высоком классе.Отсутствует только одна нижняя граница в низшем классе, которая равна минимальному значению столбца, который вы пытаетесь классифицировать в вашем DataFrame.
Вот пример округления всех чисел до целых:
# get all upper bounds
upper_bounds = mc.Quantiles(gdf.random_col, k=5).bins
# get and format all bounds
bounds = []
for index, upper_bound in enumerate(upper_bounds):
if index == 0:
lower_bound = gdf.random_col.min()
else:
lower_bound = upper_bounds[index-1]
# format the numerical legend here
bound = f'{lower_bound:.0f} - {upper_bound:.0f}'
bounds.append(bound)
# get all the legend labels
legend_labels = ax.get_legend().get_texts()
# replace the legend labels
for bound, legend_label in zip(bounds, legend_labels):
legend_label.set_text(bound)
В итоге мы получим:
Метод 2:
В дополнение к GeoPandas '.plot()
В качестве метода вы также можете рассмотреть функцию .choropleth()
, предлагаемую геоплотом , в которой вы можете легко использовать различные типы схем и количество классов при передаче аргумента legend_labels
для изменения меток легенды.Например,
import geopandas as gpd
import geoplot as gplt
path = gpd.datasets.get_path('naturalearth_lowres')
gdf = gpd.read_file(path)
legend_labels = ['< 2.4', '2.4 - 6', '6 - 15', '15 - 38', '38 - 140 M']
gplt.choropleth(gdf, hue='pop_est', cmap='Blues', scheme='quantiles',
legend=True, legend_labels=legend_labels)
, что дает вам