Tom*_*ees 4 python matplotlib python-3.x geopandas
axes在同一图中为三个设置一致的配色方案?以下应该是一个完全可重现的示例来运行代码并获得我在下面发布的相同图。
从国家统计局获取 shapefile 数据。在终端中将其作为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
Run Code Online (Sandbox Code Playgroud)
读取 shapefile 并创建GeoDataFrame用于再现行为的虚拟对象的 Python 代码。
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)))
Run Code Online (Sandbox Code Playgroud)
从 ONS 加入 shapefile 并创建一个 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)
Run Code Online (Sandbox Code Playgroud)
制作情节
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')
Run Code Online (Sandbox Code Playgroud)
ax对象共享相同的垃圾箱(最好是central_pop场景quantiles),以便整个图的图例保持一致。在quantiles从一个场景(中心)将成为levels所有这样我应该在最右边看到更深的颜色(更红),ax显示high_pop场景。
如何为整个图形/每个ax对象设置颜色方案箱?
我可以看到这个工作的最简单的方法是 a) 为geopandas.plot()函数提供一组 bins b) 从一个中提取颜色方案/binsax并将其应用于另一个。
从 geopandas 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()
Run Code Online (Sandbox Code Playgroud)
所以剩下的任务是从其中一列的分位数中获取一个 bin 列表。这应该很容易完成,例如通过
import mapclassify
bins = mapclassify.Quantiles(gdf['quant'], k=5).bins
Run Code Online (Sandbox Code Playgroud)
然后classification_kwds=dict(bins=bins)在上面的代码中设置。
| 归档时间: |
|
| 查看次数: |
3633 次 |
| 最近记录: |