1. 下载中国地图GeoJSON数据
首先需要获取中国省份的GeoJSON地理信息数据。推荐使用阿里云DataV提供的县级选择器工具:
在页面中选择“中国省级”,下载 china_province.geojson 文件,保存到项目目录中。

2. 编写Python绘图脚本
在AI辅助下完成如下Python脚本,实现地图绘制、数据合并、自定义配色、百分比标签与图例输出。
import os
import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from matplotlib.patheffects import withStroke
from matplotlib.colors import Normalize, LinearSegmentedColormap
from matplotlib.cm import ScalarMappable
# ==============================
# 配置参数
# ==============================
PLOT_CONFIG = {
'figsize': (8, 7),
'cmap': 'warm_africa', # ✅ 自定义暖色调(米黄→橙→深红棕)
'linewidth': 0.6,
'edgecolor': 'black',
'missing_color': '#D9CDB4',
'title': '中国主要省份排水管网老化比例分布', # ✅ 更新标题
'title_fontsize': 14,
'label_fontsize': 9,
'dpi': 300
}
# ==============================
# 1 读取中国地图
# ==============================
def clean_province_name(name):
suffixes = ["省", "市", "自治区", "壮族", "回族", "维吾尔", "特别行政区"]
for suffix in suffixes:
name = name.replace(suffix, "")
return name
geojson_path = "china_province.geojson"
if not os.path.exists(geojson_path):
raise FileNotFoundError(f"找不到文件: {geojson_path}")
china = gpd.read_file(geojson_path)
china["name"] = china["name"].apply(clean_province_name)
# ==============================
# 2 模拟数据:各省老化比例(示例)
# ==============================
data = {
"黑龙江": 0.60,
"吉林": 0.60,
"辽宁": 0.60,
"贵州": 0.60,
"北京": 0.40,
"上海": 0.35,
"广东": 0.30,
"山西": 0.25,
"山东": 0.20,
"江苏": 0.20,
"浙江": 0.20,
"湖南": 0.25,
"江西": 0.20,
"福建": 0.20,
"广西": 0.20
}
df = pd.DataFrame(list(data.items()), columns=["name", "value"])
# ==============================
# 3 合并数据
# ==============================
china = china.merge(df, on="name", how="left")
# 数据验证
merged_data = china.dropna(subset=["value"])
missing_provinces = set(df['name']) - set(merged_data['name'])
if missing_provinces:
print(f"警告: 以下省份在地图中未找到: {missing_provinces}")
# ==============================
# 3.5 注册自定义配色
# ==============================
warm_colors = [
"#F5E6C8", # 浅米黄(低值)
"#F0C070", # 浅橙黄
"#E8913A", # 橙色
"#C95C1A", # 深橙
"#8B2500", # 深红棕(高值)
]
warm_cmap = LinearSegmentedColormap.from_list("warm_africa", warm_colors, N=256)
plt.colormaps.register(warm_cmap, name="warm_africa", force=True)
# ==============================
# 4 绘图
# ==============================
fig, ax = plt.subplots(figsize=PLOT_CONFIG['figsize'])
vmin, vmax = 0.0, 1.0
china.plot(
column="value",
cmap=PLOT_CONFIG['cmap'],
linewidth=PLOT_CONFIG['linewidth'],
edgecolor=PLOT_CONFIG['edgecolor'],
vmin=vmin,
vmax=vmax,
legend=False,
missing_kwds={
"color": PLOT_CONFIG['missing_color'],
"label": "暂无数据",
"hatch": "///"
},
ax=ax
)
# 手动添加 colorbar
norm = Normalize(vmin=vmin, vmax=vmax)
sm = ScalarMappable(cmap=PLOT_CONFIG['cmap'], norm=norm)
sm.set_array([])
cbar = fig.colorbar(
sm, ax=ax,
orientation='vertical',
shrink=0.5,
pad=0.02,
aspect=20,
fraction=0.03
)
cbar.set_label('老化比例', fontsize=9, labelpad=6)
cbar.set_ticks([0, 0.2, 0.4, 0.6, 0.8, 1.0])
cbar.ax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, _: f"{int(x * 100)}%"))
cbar.ax.tick_params(labelsize=8)
# ==============================
# 5 添加百分比标签
# ==============================
for idx, row in china.dropna(subset=["value"]).iterrows():
if row.geometry and not row.geometry.is_empty:
point = row.geometry.representative_point()
ax.text(
point.x, point.y,
f"{row['value'] * 100:.0f}%",
ha="center", va="center",
fontsize=PLOT_CONFIG['label_fontsize'],
color='white',
weight='bold',
path_effects=[withStroke(linewidth=2, foreground='black')]
)
# ==============================
# 6 美化与标题
# ==============================
plt.rcParams['font.sans-serif'] = ['SimHei', 'PingFang SC', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
ax.set_title(
PLOT_CONFIG['title'],
fontsize=PLOT_CONFIG['title_fontsize'],
fontweight='bold',
pad=12
)
ax.axis("off")
fig.text(
0.5, 0.01,
'注:仅展示部分省份数据,灰色区域表示暂无数据',
ha='center', fontsize=7, color='#888888', style='italic'
)
plt.tight_layout()
# ==============================
# 7 输出图片
# ==============================
plt.savefig("china_map.png", dpi=PLOT_CONFIG['dpi'], bbox_inches="tight")
plt.savefig("china_map.svg", bbox_inches="tight")
plt.show()
3. 安装Python依赖库
在运行脚本前,请确保已安装以下Python库:
pip install geopandas pandas matplotlib
将下载的china_province.geojson文件与main.py脚本放在同一目录下,并确保Python环境已正确配置。
4. 最后输出的结果
运行main.py文件后,将在该目录下生成以下两张图片文件:
china_map.png(300 DPI,适合展示)china_map.svg(矢量格式,适合印刷或进一步编辑)
最终PNG图效果如下图所示:

评论