本文将介绍如何使用升级后的 geo_plotkit 包中的 ColorNorm 类与 add_admin_choropleth 函数,自动化地定制矢量数据图的颜色映射与色条参数。我们将通过多个具体案例,展示如何利用这些高效定制的工具绘制复杂多子图,轻松实现每列共用色条或每个子图独立色条等高级排版需求。
查看新增的分级设色图函数
首先,了解一下用于绘制行政区划地图的核心函数 add_admin_choropleth。
import geo_plotkit.plot as gp
help(gp.add_admin_choropleth)
其函数语法和主要参数如下:
Help on function add_admin_choropleth in module geo_plotkit.plot.cn_plot:
add_admin_choropleth(ax, df, level: geo_plotkit.data.constants.AdminLevel, region_col: str, value_col: str, cmap='viridis', norm=None, edgecolor='k', linewidth=0.5, zorder=4, alpha=1.0)
在 Cartopy 地图坐标轴上绘制行政区划分级设色图(Choropleth Map)。
该函数会:
1. 自动读取对应行政级别的矢量边界数据
2. 将用户提供的数据表按行政区名称进行属性连接
3. 根据数值字段进行颜色映射填色
4. 返回可用于 colorbar 的 mappable 对象
Parameters
----------
ax : matplotlib.axes.Axes
Cartopy 投影坐标轴(如 LambertConformal、PlateCarree 等)。
df : pandas.DataFrame
含行政区名称与数值字段的数据表,每一行对应一个行政区。
level : AdminLevel
行政区级别枚举(如 PROVINCE / CITY / COUNTY),
用于自动选择对应级别的 shapefile。
region_col : str
df 中“行政区名称”所在字段名,
需与行政区矢量数据中的名称字段一致(如“广东省”“广州市”)。
value_col : str
df 中需要用于填色的数值字段名。
cmap : str or matplotlib.colors.Colormap, optional
颜色映射方案,可以是:
- matplotlib 内置 colormap 名称(如 ‘viridis’)
- 自定义 Colormap 对象
norm : matplotlib.colors.Normalize or None, optional
颜色归一化对象。
若为 None,则自动根据 value_col 的最小值和最大值构造 Normalize。
edgecolor : str, optional
行政区边界线颜色。
linewidth : float, optional
行政区边界线宽度。
zorder : int, optional
图层绘制顺序,值越大越靠上。
alpha : float, optional
填色透明度(0~1)。
Returns
-------
ax : matplotlib.axes.Axes
原坐标轴对象(便于链式调用)。
mappable : matplotlib.cm.ScalarMappable
用于后续创建 colorbar 的颜色映射对象。
查看新增的色条渲染函数
升级的重点之一是 ColorNorm 类的 render_colorbar 方法,它提供了丰富的参数来自定义色条的显示。
from geo_plotkit.style.cmap_norm import ColorNorm
help(ColorNorm.render_colorbar)
Help on function render_colorbar in module geo_plotkit.style.cmap_norm:
render_colorbar(self, fig, cax, mappable, orientation='horizontal', label=None, label_kwargs=None, tick_kwargs=None, outline=False, n_ticks=5, scientific=True, powerlimits=(-2, 3), ticks_position='bottom')
渲染 colorbar 的方法
参数
----
fig : matplotlib.figure.Figure
所属 figure 对象
cax : matplotlib.axes.Axes
colorbar 所在的 axes
mappable : matplotlib.cm.ScalarMappable
映射数据到颜色的对象(通常是 choropleth 或 imshow 返回的 mappable)
orientation : str
‘horizontal’ 或 ‘vertical’
label : str
colorbar 的标签文本
label_kwargs : dict
传给 cbar.set_label 的参数,例如字体大小、粗细
tick_kwargs : dict
传给 cbar.ax.tick_params 的参数,例如 labelsize、方向
outline : bool
是否显示 colorbar 的边框
n_ticks : int
colorbar 上刻度数量(包含两端)
scientific : bool
是否使用科学计数法显示刻度
powerlimits : tuple
科学计数法阈值,用于 ScalarFormatter
ticks_position : str
刻度显示位置:
- 横向 colorbar:‘top’ 或 ‘bottom’
- 纵向 colorbar:‘left’ 或 ‘right’
返回
----
cbar : matplotlib.colorbar.Colorbar
渲染好的 colorbar 对象
案例一:每列共用色条——离散色系
假设我们有一份中国各省份2000、2010、2022年三种农作物(玉米、水稻、小麦)的数据。我们希望绘制一个3x3的子图矩阵,行表示年份,列表示作物,并且同一列(同一种作物)的多个年份子图共用一个色条。
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import frykit.plot as fplt
import cartopy.crs as ccrs
from matplotlib.gridspec import GridSpec
import geo_plotkit.plot as gp
from geo_plotkit import(
set_journal_style,
cn_map,
add_province_names,
add_id,
ColorNormBuilder,
)
from geo_plotkit.data import get_admin_path, AdminLevel
# -----------------------------------------------------------------------------
# 基本设置
# -----------------------------------------------------------------------------
os.chdir(r‘xxx’)
set_journal_style(‘nature’)
# -----------------------------------------------------------------------------
# 读取数据
# -----------------------------------------------------------------------------
df = pd.read_excel(‘农作物数据.xlsx’)
maize = df[(df[‘crop’] == ‘Maize’) & (df[‘year’].isin([2000, 2010, 2022]))]
rice = df[(df[‘crop’] == ‘Rice’) & (df[‘year’].isin([2000, 2010, 2022]))]
wheat = df[(df[‘crop’] == ‘Wheat’) & (df[‘year’].isin([2000, 2010, 2022]))]
# -----------------------------------------------------------------------------
# 颜色映射(离散 + extend)
# -----------------------------------------------------------------------------
colornorm1 = (
ColorNormBuilder()
.set_data(maize[‘data’].values)
.set_cmap(name=“PiYG”)
.set_norm(mode=“discrete”, scheme=“quantile”, n=20, extend=“both”)
.build()
)
colornorm2 = (
ColorNormBuilder()
.set_data(rice[‘data’].values)
.set_cmap(name=“bwr”)
.set_norm(mode=“discrete”, scheme=“quantile”, n=20, extend=“both”)
.build()
)
colornorm3 = (
ColorNormBuilder()
.set_data(wheat[‘data’].values)
.set_cmap(name=“BrBG”)
.set_norm(mode=“discrete”, scheme=“quantile”, n=20, extend=“both”)
.build()
)
colornorms = [colornorm1, colornorm2, colornorm3]
# -----------------------------------------------------------------------------
# Figure + GridSpec(4 行:3 行地图 + 1 行 colorbar)
# -----------------------------------------------------------------------------
fig = plt.figure(figsize=(18, 16))
gs = GridSpec(
4, 3,
height_ratios=[1, 1, 1, 0.08], # 最后一行很薄
hspace=0.08,
wspace=0.05
)
# 创建地图子图
axes = np.empty((3, 3), dtype=object)
for i in range(3):
for j in range(3):
axes[i, j] = fig.add_subplot(
gs[i, j],
projection=ccrs.LambertConformal(
central_longitude=105,
central_latitude=35,
standard_parallels=(25, 47)
)
)
# -----------------------------------------------------------------------------
# 读取省级行政区
# -----------------------------------------------------------------------------
province = gpd.read_file(get_admin_path(‘省’))
years = [2000, 2010, 2022]
crops = [‘Maize’, ‘Rice’, ‘Wheat’]
crop_data = [maize, rice, wheat]
# 每列一个 mappable(用于 colorbar)
mappables = [None, None, None]
# -----------------------------------------------------------------------------
# 绘制地图
# -----------------------------------------------------------------------------
for i in range(3): # 行:年份
for j in range(3): # 列:作物
ax = axes[i, j]
# (a)(b)(c) 编号
add_id(ax, i * 3 + j, [0.05, 0.95])
# 边框控制
left = (j == 0)
right = (j == 3)
top = (i == 0)
bottom = (i == 3)
ax, _ = cn_map(
ax,
style=‘standard’,
add_grid=False,
add_nanhai=True,
left=left,
right=right,
bottom=bottom,
top=top
)
# 当前作物 & 年份数据
year_df = crop_data[j][crop_data[j][‘year’] == years[i]]
# 行政区填色
ax, mappable = gp.add_admin_choropleth(
ax,
year_df,
region_col=‘province’,
value_col=‘data’,
level=AdminLevel.PROVINCE,
cmap=colornorms[j].cmap,
norm=colornorms[j].norm
)
mappables[j] = mappable
# 省名
add_province_names(
ax,
col_name=‘英文简称’,
fontsize=8,
fontweight=‘bold’,
color=‘w’,
fontfamily=‘SimHei’
)
# 添加指北针
fplt.add_compass(ax, 0.05, 0.8, size=18, angle=0)
# -----------------------------------------------------------------------------
# 第 4 行:每列一个 colorbar(cax 原生方式)
# -----------------------------------------------------------------------------
for j in range(3):
cax = fig.add_subplot(gs[3, j])
colornorms[j].render_colorbar(
fig,
cax,
mappables[j],
label=crops[j],
label_kwargs=dict(fontsize=12, fontweight=‘bold’),
tick_kwargs=dict(labelsize=10),
outline=False,
n_ticks=5
)
# -----------------------------------------------------------------------------
# 显示
# -----------------------------------------------------------------------------
plt.show()
运行上述代码,将生成一个3行3列的地图矩阵,底部为每列作物对应的离散色系色条。

案例二:每列共用色条——连续色系
同样的数据布局,我们也可以使用连续色系,并略微调整地图填色的透明度以增强可读性。
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import cartopy.crs as ccrs
from matplotlib.gridspec import GridSpec
import geo_plotkit.plot as gp
from geo_plotkit import(
set_journal_style,
cn_map,
add_province_names,
add_id,
ColorNormBuilder,
)
from geo_plotkit.data import get_admin_path, AdminLevel
# -----------------------------------------------------------------------------
# 基本设置
# -----------------------------------------------------------------------------
os.chdir(r‘xxx’)
set_journal_style(‘nature’)
# -----------------------------------------------------------------------------
# 读取数据
# -----------------------------------------------------------------------------
df = pd.read_excel(‘农作物数据.xlsx’)
maize = df[(df[‘crop’] == ‘Maize’) & (df[‘year’].isin([2000, 2010, 2022]))]
rice = df[(df[‘crop’] == ‘Rice’) & (df[‘year’].isin([2000, 2010, 2022]))]
wheat = df[(df[‘crop’] == ‘Wheat’) & (df[‘year’].isin([2000, 2010, 2022]))]
# -----------------------------------------------------------------------------
# 颜色映射(离散 + extend)
# -----------------------------------------------------------------------------
colornorm1 = (
ColorNormBuilder()
.set_data(maize[‘data’].values)
.set_cmap(name=“WhiteBlueGreenYellowRed”, truncate=(0.05,0.95),n=256)
.set_norm(mode=“continuous”, clip_percent=(2, 98))
.build()
)
colornorm2 = (
ColorNormBuilder()
.set_data(rice[‘data’].values)
.set_cmap(name=“WhBlGrYeRe”, truncate=(0.05,0.95),n=256)
.set_norm(mode=“continuous”, clip_percent=(2, 98))
.build()
)
colornorm3 = (
ColorNormBuilder()
.set_data(wheat[‘data’].values)
.set_cmap(name=“WhViBlGrYeOrRe”, truncate=(0.05,0.95),n=256)
.set_norm(mode=“continuous”, clip_percent=(2, 98))
.build()
)
colornorms = [colornorm1, colornorm2, colornorm3]
# -----------------------------------------------------------------------------
# Figure + GridSpec(4 行:3 行地图 + 1 行 colorbar)
# -----------------------------------------------------------------------------
fig = plt.figure(figsize=(18, 16))
gs = GridSpec(
4, 3,
height_ratios=[1, 1, 1, 0.08], # 最后一行很薄
hspace=0.08,
wspace=0.05
)
# 创建地图子图
axes = np.empty((3, 3), dtype=object)
for i in range(3):
for j in range(3):
axes[i, j] = fig.add_subplot(
gs[i, j],
projection=ccrs.LambertConformal(
central_longitude=105,
central_latitude=35,
standard_parallels=(25, 47)
)
)
# -----------------------------------------------------------------------------
# 读取省级行政区
# -----------------------------------------------------------------------------
province = gpd.read_file(get_admin_path(‘省’))
years = [2000, 2010, 2022]
crops = [‘Maize’, ‘Rice’, ‘Wheat’]
crop_data = [maize, rice, wheat]
# 每列一个 mappable(用于 colorbar)
mappables = [None, None, None]
# -----------------------------------------------------------------------------
# 绘制地图
# -----------------------------------------------------------------------------
for i in range(3): # 行:年份
for j in range(3): # 列:作物
ax = axes[i, j]
# (a)(b)(c) 编号
add_id(ax, i * 3 + j, [0.05, 0.95])
# 边框控制
left = (j == 0)
right = (j == 3)
top = (i == 0)
bottom = (i == 3)
ax, _ = cn_map(
ax,
style=‘standard’,
add_grid=False,
add_nanhai=True,
left=left,
right=right,
bottom=bottom,
top=top
)
# 当前作物 & 年份数据
year_df = crop_data[j][crop_data[j][‘year’] == years[i]]
# 行政区填色
ax, mappable = gp.add_admin_choropleth(
ax,
year_df,
region_col=‘province’,
value_col=‘data’,
level=AdminLevel.PROVINCE,
cmap=colornorms[j].cmap,
norm=colornorms[j].norm,
alpha=0.35
)
mappables[j] = mappable
# 省名
add_province_names(
ax,
col_name=‘英文简称’,
fontsize=8,
fontweight=‘bold’,
color=‘darkblue’,
fontfamily=‘SimHei’
)
# 添加指北针
fplt.add_compass(ax, 0.05, 0.8, size=18, angle=0)
# -----------------------------------------------------------------------------
# 第 4 行:每列一个 colorbar(cax 原生方式)
# -----------------------------------------------------------------------------
for j in range(3):
cax = fig.add_subplot(gs[3, j])
colornorms[j].render_colorbar(
fig,
cax,
mappables[j],
label=crops[j],
label_kwargs=dict(fontsize=12, fontweight=‘bold’),
tick_kwargs=dict(labelsize=10),
outline=False
)
# -----------------------------------------------------------------------------
# 显示
# -----------------------------------------------------------------------------
plt.show()

案例三:自定义色系
你完全可以摆脱内置色板的限制,使用自定义的渐变色。这里我们为玉米、水稻、小麦分别创建了白到蓝、白到红、白到绿的渐变色。
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import frykit.plot as fplt
import cartopy.crs as ccrs
from matplotlib.gridspec import GridSpec
import geo_plotkit.plot as gp
from geo_plotkit import(
set_journal_style,
cn_map,
add_province_names,
add_id,
ColorNormBuilder,
)
from geo_plotkit.data import get_admin_path, AdminLevel
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
set_journal_style(‘science’)
# 白 -> 蓝
white_blue = LinearSegmentedColormap.from_list(
“white_blue”,
[“#ffffff”, “#313772”],
N=256
)(np.linspace(0, 1, 256))
white_red = LinearSegmentedColormap.from_list(
“White_red”,
[“#ffffff”, “#b7282e”],
N=256
)(np.linspace(0, 1, 256))
white_green = LinearSegmentedColormap.from_list(
“white_green”,
[“#ffffff”, “#376439”],
N=256
)(np.linspace(0, 1, 256))
# -----------------------------------------------------------------------------
# 基本设置
# -----------------------------------------------------------------------------
os.chdir(r‘xxx’)
set_journal_style(‘nature’)
# -----------------------------------------------------------------------------
# 读取数据
# -----------------------------------------------------------------------------
df = pd.read_excel(‘农作物数据.xlsx’)
maize = df[(df[‘crop’] == ‘Maize’) & (df[‘year’].isin([2000, 2010, 2022]))]
rice = df[(df[‘crop’] == ‘Rice’) & (df[‘year’].isin([2000, 2010, 2022]))]
wheat = df[(df[‘crop’] == ‘Wheat’) & (df[‘year’].isin([2000, 2010, 2022]))]
# -----------------------------------------------------------------------------
# 颜色映射(离散 + extend)
# -----------------------------------------------------------------------------
colornorm1 = (
ColorNormBuilder()
.set_data(maize[‘data’].values)
.set_cmap(colors=white_blue)
.set_norm(mode=“continuous”, clip_percent=(‘max’, 98))
.build()
)
colornorm2 = (
ColorNormBuilder()
.set_data(rice[‘data’].values)
.set_cmap(colors=white_red)
.set_norm(mode=“continuous”, clip_percent=(‘max’, 98))
.build()
)
colornorm3 = (
ColorNormBuilder()
.set_data(wheat[‘data’].values)
.set_cmap(colors=white_green)
.set_norm(mode=“continuous”, clip_percent=(‘max’, 98))
.build()
)
colornorms = [colornorm1, colornorm2, colornorm3]
# -----------------------------------------------------------------------------
# Figure + GridSpec(4 行:3 行地图 + 1 行 colorbar)
# -----------------------------------------------------------------------------
fig = plt.figure(figsize=(18, 16))
gs = GridSpec(
4, 3,
height_ratios=[1, 1, 1, 0.08], # 最后一行很薄
hspace=0.08,
wspace=0.05
)
# 创建地图子图
axes = np.empty((3, 3), dtype=object)
for i in range(3):
for j in range(3):
axes[i, j] = fig.add_subplot(
gs[i, j],
projection=ccrs.LambertConformal(
central_longitude=105,
central_latitude=35,
standard_parallels=(25, 47)
)
)
# -----------------------------------------------------------------------------
# 读取省级行政区
# -----------------------------------------------------------------------------
province = gpd.read_file(get_admin_path(‘省’))
years = [2000, 2010, 2022]
crops = [‘Maize’, ‘Rice’, ‘Wheat’]
crop_data = [maize, rice, wheat]
# 每列一个 mappable(用于 colorbar)
mappables = [None, None, None]
# -----------------------------------------------------------------------------
# 绘制地图
# -----------------------------------------------------------------------------
for i in range(3): # 行:年份
for j in range(3): # 列:作物
ax = axes[i, j]
# (a)(b)(c) 编号
add_id(ax, i * 3 + j, [0.05, 0.95])
# 边框控制
left = (j == 0)
right = (j == 3)
top = (i == 0)
bottom = (i == 3)
ax, _ = cn_map(
ax,
style=‘standard’,
add_grid=False,
add_nanhai=True,
left=left,
right=right,
bottom=bottom,
top=top
)
# 当前作物 & 年份数据
year_df = crop_data[j][crop_data[j][‘year’] == years[i]]
# 行政区填色
ax, mappable = gp.add_admin_choropleth(
ax,
year_df,
region_col=‘province’,
value_col=‘data’,
level=AdminLevel.PROVINCE,
cmap=colornorms[j].cmap,
norm=colornorms[j].norm,
alpha=1
)
mappables[j] = mappable
# 省名
add_province_names(
ax,
col_name=‘中文简称’,
fontsize=8,
fontweight=‘bold’,
color=‘w’,
fontfamily=‘SimHei’
)
# 添加指北针
fplt.add_compass(ax, 0.05, 0.8, size=18, angle=0)
# -----------------------------------------------------------------------------
# 第 4 行:每列一个 colorbar(cax 原生方式)
# -----------------------------------------------------------------------------
for j in range(3):
cax = fig.add_subplot(gs[3, j])
colornorms[j].render_colorbar(
fig,
cax,
mappables[j],
label=crops[j],
label_kwargs=dict(fontsize=12, fontweight=‘bold’),
tick_kwargs=dict(labelsize=10),
outline=False
)
# -----------------------------------------------------------------------------
# 显示
# -----------------------------------------------------------------------------
plt.show()

案例四:各子图单独添加色条
前述案例均为每列共享一个色条。有时,我们需要每个子图都有自己的色条,特别是当各子图的数据范围差异较大时。render_colorbar 方法同样可以配合 inset_axes 轻松实现这一需求。
在涉及复杂的Python数据处理与地理空间分析时,灵活调整绘图细节至关重要。
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import cartopy.crs as ccrs
from matplotlib.gridspec import GridSpec
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.colors import LinearSegmentedColormap
import geo_plotkit.plot as gp
from geo_plotkit import(
set_journal_style,
cn_map,
add_province_names,
add_id,
ColorNormBuilder,
)
from geo_plotkit.data import get_admin_path, AdminLevel
# =============================================================================
# 1. 列级统一配色(Maize / Rice / Wheat)
# =============================================================================
white_blue = LinearSegmentedColormap.from_list(
“white_blue”,
[“#ffffff”, “#313772”],
N=256
)(np.linspace(0, 1, 256))
white_red = LinearSegmentedColormap.from_list(
“white_red”,
[“#ffffff”, “#b7282e”],
N=256
)(np.linspace(0, 1, 256))
white_green = LinearSegmentedColormap.from_list(
“white_green”,
[“#ffffff”, “#376439”],
N=256
)(np.linspace(0, 1, 256))
cmaps = [white_blue, white_red, white_green] # 列 → 作物
# =============================================================================
# 2. 基本设置
# =============================================================================
os.chdir(r‘xxx’)
set_journal_style(‘nature’, fontsize=9)
# =============================================================================
# 3. 读取数据
# =============================================================================
df = pd.read_excel(‘农作物数据.xlsx’)
years = [2000, 2010, 2022] # 行
crops = [‘Maize’, ‘Rice’, ‘Wheat’] # 列
maize = df[df[‘crop’] == ‘Maize’]
rice = df[df[‘crop’] == ‘Rice’]
wheat = df[df[‘crop’] == ‘Wheat’]
crop_data = [maize, rice, wheat] # 列顺序一致
# =============================================================================
# 4. Figure + GridSpec(3 × 3)
# =============================================================================
fig = plt.figure(figsize=(18, 16))
gs = GridSpec(
3, 3,
hspace=0.08,
wspace=0.05
)
axes = np.empty((3, 3), dtype=object)
for i in range(3): # 行:年份
for j in range(3): # 列:作物
axes[i, j] = fig.add_subplot(
gs[i, j],
projection=ccrs.LambertConformal(
central_longitude=105,
central_latitude=35,
standard_parallels=(25, 47)
)
)
# =============================================================================
# 5. 行政区数据
# =============================================================================
province = gpd.read_file(get_admin_path(‘省’))
# =============================================================================
# 6. 绘制地图(严格:行=年份,列=作物)
# =============================================================================
for i, year in enumerate(years): # 行 → 年份
for j, crop in enumerate(crops): # 列 → 作物
ax = axes[i, j]
# 子图编号
add_id(ax, i * 3 + j, [0.05, 0.95])
# 边框
left = (j == 0)
right = (j == 2)
top = (i == 0)
bottom = (i == 2)
ax, _ = cn_map(
ax,
x=0.05,
y=0.06,
style=‘standard’,
add_grid=False,
add_nanhai=True,
left=left,
right=right,
bottom=bottom,
top=top
)
# -----------------------------
# 当前子图数据:作物 × 年份
# -----------------------------
year_df = crop_data[j][crop_data[j][‘year’] == year]
# 子图级 ColorNorm(关键)
colornorm = (
ColorNormBuilder()
.set_data(year_df[‘data’].values)
.set_cmap(colors=cmaps[j]) # 按列统一颜色
.set_norm(mode=“continuous”, clip_percent=(‘max’, 98))
.build()
)
# 行政区填色
ax, mappable = gp.add_admin_choropleth(
ax,
year_df,
region_col=‘province’,
value_col=‘data’,
level=AdminLevel.PROVINCE,
cmap=colornorm.cmap,
norm=colornorm.norm,
alpha=0.8
)
# 省名
add_province_names(
ax,
col_name=‘英文简称’,
fontsize=8,
fontweight=‘bold’,
color=‘w’
)
# -----------------------------
# inset colorbar(左下角,横向)
# -----------------------------
cax = inset_axes(
ax,
width=“28%”,
height=“4%”,
loc=“lower left”,
bbox_to_anchor=(0.035, 0.1, 1, 1), # (1, 1) 基本可以忽略,在 inset_axes 场景下不参与尺寸计算
bbox_transform=ax.transAxes,
borderpad=0
)
colornorm.render_colorbar(
fig,
cax,
mappable,
orientation=“horizontal”,
tick_kwargs=dict(labelsize=8),
outline=False,
n_ticks=2,
ticks_position=“top”
)
# =============================================================================
# 7. 显示
# =============================================================================
plt.show()

通过 ColorNorm 与 add_admin_choropleth 的灵活组合,geo_plotkit 极大地简化了地理空间数据可视化的配色与排版流程。无论是批量处理还是精细定制,这套工具链都能提供强大的支持,希望本文的案例能对你的 Python 绘图工作有所帮助。如果你在云栈社区有相关的技术心得或问题,欢迎交流探讨。
