Matplotlib Geopandas строит хлороплет с набором ячеек для схемы цветов - PullRequest
1 голос
/ 20 июня 2019

Как установить согласованную цветовую схему для трех axes на одном и том же рисунке?

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

Получите данные шейп-файла из Управления национальной статистики .Запустите это в терминале как bash файл / команды.

wget --output-document 'LA_authorities_boundaries.zip' 'https://opendata.arcgis.com/datasets/8edafbe3276d4b56aec60991cbddda50_1.zip?outSR=%7B%22latestWkid%22%3A27700%2C%22wkid%22%3A27700%7D&session=850489311.1553456889'

mkdir LA_authorities_boundaries
cd LA_authorities_boundaries
unzip ../LA_authorities_boundaries.zip

Код Python, который читает шейп-файл и создает фиктивный GeoDataFrame для воспроизведения поведения.

import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt

gdf = gpd.read_file(
    'LA_authorities_boundaries/Local_Authority_Districts_December_2015_Full_Extent_Boundaries_in_Great_Britain.shp'
)

# 380 values
df = pd.DataFrame([])
df['AREA_CODE'] = gdf.lad15cd.values
df['central_pop'] = np.random.normal(30, 15, size=(len(gdf.lad15cd.values)))
df['low_pop'] = np.random.normal(10, 15, size=(len(gdf.lad15cd.values)))
df['high_pop'] = np.random.normal(50, 15, size=(len(gdf.lad15cd.values)))

Присоединитесь к шейп-файлу из ONS и создайте geopandas.GeoDataFrame

def join_df_to_shp(pd_df, gpd_gdf):
    """"""
    df_ = pd.merge(pd_df, gpd_gdf[['lad15cd','geometry']], left_on='AREA_CODE', right_on='lad15cd', how='left')

    # DROP the NI counties
    df_ = df_.dropna(subset=['geometry'])

    # convert back to a geopandas object (for ease of plotting etc.)
    crs = {'init': 'epsg:4326'}
    gdf_ = gpd.GeoDataFrame(df_, crs=crs, geometry='geometry')
    # remove the extra area_code column joined from gdf
    gdf_.drop('lad15cd',axis=1, inplace=True)

    return gdf_

pop_gdf = join_df_to_shp(df, gdf)

Создайте графики

fig,(ax1,ax2,ax3,) = plt.subplots(1,3,figsize=(15,6))

pop_gdf.plot(
    column='low_pop', ax=ax1, legend=True,  scheme='quantiles', cmap='OrRd',
)
pop_gdf.plot(
    column='central_pop', ax=ax2, legend=True, scheme='quantiles', cmap='OrRd',
)
pop_gdf.plot(
    column='high_pop', ax=ax3, legend=True,  scheme='quantiles', cmap='OrRd',
)
for ax in (ax1,ax2,ax3,):
    ax.axis('off')

enter image description here

Я хочувсе три ax объекта совместно используют одни и те же ячейки (предпочтительнее сценарий central_pop quantiles), чтобы легенда соответствовала всей фигуре.Сценарий quantiles из ОДНОГО (центральный) станет levels для всех

Таким образом, я должен видеть более темные цвета (более красные) в крайнем правом углу ax, показывая сценарий high_pop.

Как я могу установить ячейки цветовой схемы для всей фигуры / каждого из ax объектов?

Простейший способ увидеть эту работу - а) Предоставить набор ячеек дляgeopandas.plot() функция b) извлечь цветовую схему / ячейки из одного ax и применить его к другому.

1 Ответ

2 голосов
/ 21 июня 2019

Начиная с геопанды 0,5 и далее, вы можете использовать пользовательскую схему, определенную как scheme="User_Defined", и снабжать биннинг через classification_kwds.

import geopandas as gpd
print(gpd.__version__)   ## 0.5
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt 

gdf = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) 
gdf['quant']=np.random.rand(len(gdf))*100-20

fig, ax = plt.subplots()

gdf.plot(column='quant', cmap='RdBu', scheme="User_Defined", 
         legend=True, classification_kwds=dict(bins=[-10,20,30,50,70]),
         ax=ax)

plt.show()

enter image description here

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

import mapclassify
bins = mapclassify.Quantiles(gdf['quant'], k=5).bins

и установки classification_kwds=dict(bins=bins) в приведенном выше коде.

enter image description here

...