Python数据可视化-地图
·
目录
一、基础地图使用
1. 安装依赖
# 安装pyecharts pip install pyecharts # 安装地图扩展包(必须) pip install pyecharts-jupyter-installer pip install echarts-countries-pypkg pip install echarts-china-provinces-pypkg pip install echarts-china-cities-pypkg pip install echarts-china-counties-pypkg
2. 基础全国地图
from pyecharts.charts import Map
from pyecharts import options as opts
# 创建地图对象
map_chart = Map()
# 准备数据:[(省份,数值), ...]
data = [
("北京市", 100),
("上海市", 80),
("广东省", 120),
("江苏省", 90),
("浙江省", 70),
("四川省", 60),
]
# 添加数据
map_chart.add(
series_name="数据分布", # 系列名称
data_pair=data, # 数据对
maptype="china", # 地图类型:china(中国地图)
is_map_symbol_show=False # 是否显示标记点
)
# 设置全局配置
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title="中国地图示例", pos_left="center"),
visualmap_opts=opts.VisualMapOpts(
min_=50,
max_=130,
range_color=["#e0f3f8", "#abd9e9", "#74add1", "#4575b4", "#313695"]
),
legend_opts=opts.LegendOpts(is_show=False)
)
# 生成HTML文件
map_chart.render("china_map_base.html")
print("基础地图已生成:china_map_base.html")
3. 视觉映射器配置
from pyecharts.charts import Map
from pyecharts import options as opts
# 创建地图对象
map_chart = Map()
# 准备数据
data = [
("北京市", 5), ("天津市", 3), ("上海市", 8), ("重庆市", 6),
("广东省", 15), ("江苏省", 12), ("浙江省", 10), ("山东省", 9),
("四川省", 7), ("湖北省", 4), ("湖南省", 5), ("河南省", 8),
]
map_chart.add(
series_name="确诊病例",
data_pair=data,
maptype="china",
is_map_symbol_show=False,
itemstyle_opts=opts.ItemStyleOpts(border_color="#111") # 边界颜色
)
# 设置分段型视觉映射器
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title="全国疫情分布地图", pos_left="center"),
# 分段型视觉映射
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True, # 分段型(True)或连续型(False)
pieces=[
{"min": 0, "max": 3, "label": "0-3人", "color": "#E8E8E8"},
{"min": 4, "max": 6, "label": "4-6人", "color": "#B0D9B1"},
{"min": 7, "max": 9, "label": "7-9人", "color": "#8FBC8F"},
{"min": 10, "max": 12, "label": "10-12人", "color": "#6B8E23"},
{"min": 13, "max": 15, "label": "13-15人", "color": "#CD853F"},
{"min": 16, "label": "16人以上", "color": "#B22222"},
]
),
legend_opts=opts.LegendOpts(is_show=False),
)
map_chart.render("china_map_piecewise.html")
print("分段地图已生成:china_map_piecewise.html")
二、国内疫情地图
1. 数据获取与处理
import json
# 模拟从API获取的疫情数据(实际项目中从JSON文件读取)
# 全国各省份确诊数据
raw_data = {
"data": {
"trend": {
"area": [
{"name": "广东省", "data": [1582, 1590, 1600]},
{"name": "河南省", "data": [1273, 1280, 1285]},
{"name": "浙江省", "data": [1205, 1210, 1215]},
{"name": "湖南省", "data": [1100, 1105, 1108]},
{"name": "安徽省", "data": [990, 995, 1000]},
{"name": "江西省", "data": [935, 940, 942]},
{"name": "江苏省", "data": [931, 935, 938]},
{"name": "山东省", "data": [883, 888, 890]},
{"name": "四川省", "data": [850, 855, 858]},
{"name": "湖北省", "data": [681, 685, 688]},
{"name": "福建省", "data": [670, 675, 678]},
{"name": "黑龙江省", "data": [590, 595, 598]},
{"name": "北京市", "data": [585, 588, 590]},
{"name": "上海市", "data": [570, 575, 578]},
{"name": "河北省", "data": [550, 555, 558]},
{"name": "陕西省", "data": [530, 535, 538]},
{"name": "广西壮族自治区", "data": [498, 502, 505]},
{"name": "云南省", "data": [480, 485, 488]},
{"name": "内蒙古自治区", "data": [420, 425, 428]},
{"name": "天津市", "data": [350, 352, 355]},
{"name": "贵州省", "data": [330, 332, 335]},
{"name": "甘肃省", "data": [300, 302, 305]},
{"name": "吉林省", "data": [280, 282, 285]},
{"name": "新疆维吾尔自治区", "data": [270, 272, 275]},
{"name": "宁夏回族自治区", "data": [200, 202, 205]},
{"name": "青海省", "data": [150, 152, 155]},
{"name": "西藏自治区", "data": [50, 52, 55]},
]
}
}
}
print("=== 数据处理 ===")
# 提取各省份最新确诊数据(取最后一日的值)
province_data = []
for area in raw_data["data"]["trend"]["area"]:
province_name = area["name"]
confirmed_count = area["data"][-1] # 取最新数据
province_data.append((province_name, confirmed_count))
print(f"{province_name}: {confirmed_count}")
print(f"\n共获取 {len(province_data)} 个省份的数据")
2. 创建全国疫情地图
from pyecharts.charts import Map
from pyecharts import options as opts
# 准备数据
data = [
("广东省", 1600), ("河南省", 1285), ("浙江省", 1215), ("湖南省", 1108),
("安徽省", 1000), ("江西省", 942), ("江苏省", 938), ("山东省", 890),
("四川省", 858), ("湖北省", 688), ("福建省", 678), ("黑龙江省", 598),
("北京市", 590), ("上海市", 578), ("河北省", 558), ("陕西省", 538),
("广西壮族自治区", 505), ("云南省", 488), ("内蒙古自治区", 428),
("天津市", 355), ("贵州省", 335), ("甘肃省", 305), ("吉林省", 285),
("新疆维吾尔自治区", 275), ("宁夏回族自治区", 205), ("青海省", 155),
("西藏自治区", 55),
]
print("=== 创建全国疫情地图 ===")
# 创建地图
virus_map = Map()
# 添加数据
virus_map.add(
series_name="累计确诊人数",
data_pair=data,
maptype="china", # 中国地图
is_map_symbol_show=False, # 不显示标记点
itemstyle_opts=opts.ItemStyleOpts(
border_color="#ffffff", # 边界颜色
border_width=0.5 # 边界宽度
),
)
# 设置全局配置(分段型视觉映射)
virus_map.set_global_opts(
title_opts=opts.TitleOpts(
title="2020年全国各省份累计确诊人数分布图",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(font_size=18)
),
# 视觉映射配置(分段)
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 0, "max": 99, "label": "0-99人", "color": "#F0F8FF"},
{"min": 100, "max": 299, "label": "100-299人", "color": "#B0E0E6"},
{"min": 300, "max": 499, "label": "300-499人", "color": "#87CEEB"},
{"min": 500, "max": 799, "label": "500-799人", "color": "#6495ED"},
{"min": 800, "max": 1099, "label": "800-1099人", "color": "#4169E1"},
{"min": 1100, "max": 1399, "label": "1100-1399人", "color": "#0000CD"},
{"min": 1400, "max": 1699, "label": "1400-1699人", "color": "#8B0000"},
{"min": 1700, "label": "1700人以上", "color": "#B22222"},
]
),
# 提示框配置
tooltip_opts=opts.TooltipOpts(
trigger="item",
formatter="{b}: {c}人"
),
# 图例配置
legend_opts=opts.LegendOpts(is_show=False),
)
# 保存地图
virus_map.render("china_covid_map.html")
print("✅ 全国疫情地图已生成:china_covid_map.html")
三、省级疫情地图(以河南省为例)
1. 河南省各市数据
import json
from pyecharts.charts import Map
from pyecharts import options as opts
# 河南省各市疫情数据
henan_data = [
("郑州市", 200), ("洛阳市", 150), ("南阳市", 140), ("周口市", 130),
("商丘市", 120), ("驻马店市", 110), ("新乡市", 100), ("信阳市", 95),
("平顶山市", 90), ("开封市", 85), ("安阳市", 80), ("许昌市", 75),
("濮阳市", 70), ("焦作市", 65), ("三门峡市", 60), ("漯河市", 55),
("鹤壁市", 50), ("济源市", 30),
]
print("=== 河南省各市数据 ===")
for city, count in henan_data:
print(f"{city}: {count}人")
print(f"\n共 {len(henan_data)} 个城市")
2. 创建河南省疫情地图
from pyecharts.charts import Map
from pyecharts import options as opts
# 创建地图对象
henan_map = Map()
# 添加数据(maptype="河南")
henan_map.add(
series_name="累计确诊人数",
data_pair=henan_data,
maptype="河南", # 省级地图
is_map_symbol_show=False,
itemstyle_opts=opts.ItemStyleOpts(
border_color="#ffffff",
border_width=0.5
),
)
# 设置全局配置
henan_map.set_global_opts(
title_opts=opts.TitleOpts(
title="河南省各市累计确诊人数分布图",
subtitle="数据来源:公开数据",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(font_size=18)
),
# 视觉映射配置(分段)
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 0, "max": 49, "label": "0-49人", "color": "#F0F8FF"},
{"min": 50, "max": 79, "label": "50-79人", "color": "#B0E0E6"},
{"min": 80, "max": 109, "label": "80-109人", "color": "#6495ED"},
{"min": 110, "max": 149, "label": "110-149人", "color": "#4169E1"},
{"min": 150, "max": 199, "label": "150-199人", "color": "#0000CD"},
{"min": 200, "label": "200人以上", "color": "#B22222"},
]
),
# 提示框配置
tooltip_opts=opts.TooltipOpts(
trigger="item",
formatter="{b}: {c}人"
),
# 图例配置
legend_opts=opts.LegendOpts(is_show=False),
)
# 保存地图
henan_map.render("henan_covid_map.html")
print("✅ 河南省疫情地图已生成:henan_covid_map.html")
四、完整综合案例
全国各省疫情地图(完整版)
import json
from pyecharts.charts import Map
from pyecharts import options as opts
# 准备全国各省疫情数据
china_regions = [
# 省份名必须与pyecharts地图中的名称完全一致
{"name": "北京市", "value": 590},
{"name": "天津市", "value": 355},
{"name": "上海市", "value": 578},
{"name": "重庆市", "value": 680},
{"name": "河北省", "value": 558},
{"name": "山西省", "value": 380},
{"name": "辽宁省", "value": 450},
{"name": "吉林省", "value": 285},
{"name": "黑龙江省", "value": 598},
{"name": "江苏省", "value": 938},
{"name": "浙江省", "value": 1215},
{"name": "安徽省", "value": 1000},
{"name": "福建省", "value": 678},
{"name": "江西省", "value": 942},
{"name": "山东省", "value": 890},
{"name": "河南省", "value": 1285},
{"name": "湖北省", "value": 688},
{"name": "湖南省", "value": 1108},
{"name": "广东省", "value": 1600},
{"name": "海南省", "value": 350},
{"name": "四川省", "value": 858},
{"name": "贵州省", "value": 335},
{"name": "云南省", "value": 488},
{"name": "陕西省", "value": 538},
{"name": "甘肃省", "value": 305},
{"name": "青海省", "value": 155},
{"name": "台湾省", "value": 300},
{"name": "香港特别行政区", "value": 450},
{"name": "澳门特别行政区", "value": 120},
{"name": "广西壮族自治区", "value": 505},
{"name": "内蒙古自治区", "value": 428},
{"name": "宁夏回族自治区", "value": 205},
{"name": "新疆维吾尔自治区", "value": 275},
{"name": "西藏自治区", "value": 55},
]
# 过滤掉数据为0或无效的省份
valid_data = [(item["name"], item["value"]) for item in china_regions if item["value"] > 0]
print("=== 地图数据统计 ===")
print(f"共 {len(valid_data)} 个省份/地区")
print(f"最高确诊: {max(valid_data, key=lambda x: x[1])}")
print(f"最低确诊: {min(valid_data, key=lambda x: x[1])}")
# 创建地图
covid_map = Map()
covid_map.add(
series_name="累计确诊人数",
data_pair=valid_data,
maptype="china",
is_map_symbol_show=False,
label_opts=opts.LabelOpts(is_show=True, font_size=10), # 显示省份标签
itemstyle_opts=opts.ItemStyleOpts(
border_color="#333333",
border_width=0.5,
area_color="#F5F5F5"
),
)
# 全局配置
covid_map.set_global_opts(
# 标题
title_opts=opts.TitleOpts(
title="全国各省份疫情累计确诊分布图",
subtitle="数据截止日期:2024年",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(font_size=20, font_weight="bold"),
subtitle_textstyle_opts=opts.TextStyleOpts(font_size=14)
),
# 视觉映射(连续型)
visualmap_opts=opts.VisualMapOpts(
is_piecewise=False, # 连续型
min_=0,
max_=1700,
range_color=[
"#F0F8FF", "#E6E6FA", "#D8BFD8", "#DDA0DD", "#EE82EE",
"#DA70D6", "#BA55D3", "#9932CC", "#9400D3", "#8B008B"
],
calculable=True, # 显示滑块
range_text=["高", "低"],
orient="vertical", # 垂直放置
pos_left="5%",
pos_top="center"
),
# 提示框
tooltip_opts=opts.TooltipOpts(
trigger="item",
formatter="{b}<br/>累计确诊: {c} 人",
background_color="rgba(0,0,0,0.7)",
border_color="#333",
textstyle_opts=opts.TextStyleOpts(color="#fff")
),
# 图例
legend_opts=opts.LegendOpts(is_show=False),
# 缩放控件
toolbox_opts=opts.ToolboxOpts(
is_show=True,
feature=opts.ToolBoxFeatureOpts(
save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(is_show=True),
restore=opts.ToolBoxFeatureRestoreOpts(is_show=True),
zoom=opts.ToolBoxFeatureZoomOpts(is_show=True)
)
),
)
# 保存文件
covid_map.render("china_complete_covid_map.html")
print("\n✅ 全国完整疫情地图已生成:china_complete_covid_map.html")
print("请在浏览器中打开该文件查看可视化效果")
五、PyCharm中安装地图包
# 方法1:命令行安装 pip install echarts-countries-pypkg pip install echarts-china-provinces-pypkg pip install echarts-china-cities-pypkg pip install echarts-china-counties-pypkg # 方法2:一次性安装 pip install pyecharts echarts-countries-pypkg echarts-china-provinces-pypkg echarts-china-cities-pypkg
六、地图类型参考
| maptype值 | 说明 | 示例 |
|---|---|---|
"china" |
中国地图 | maptype="china" |
"广东" |
广东省地图 | maptype="广东" |
"河南" |
河南省地图 | maptype="河南" |
"浙江" |
浙江省地图 | maptype="浙江" |
"四川" |
四川省地图 | maptype="四川" |
"北京" |
北京市地图 | maptype="北京" |
七、VisualMap配置速查
# 连续型视觉映射
opts.VisualMapOpts(
is_piecewise=False, # 连续型
min_=0, # 最小值
max_=100, # 最大值
range_color=["#blue", "#red"] # 颜色范围
)
# 分段型视觉映射
opts.VisualMapOpts(
is_piecewise=True, # 分段型
pieces=[ # 分段规则
{"min": 0, "max": 10, "label": "0-10", "color": "#green"},
{"min": 11, "max": 50, "label": "11-50", "color": "#yellow"},
{"min": 51, "label": "51以上", "color": "#red"},
]
)
八、常见问题解决
1. 地图不显示
# 确认已安装地图包
import echarts_countries_pypkg
import echarts_china_provinces_pypkg
print("地图包已安装")
2. 省份名称不匹配
# 省份名称必须与pyecharts内置名称一致
# 正确示例:
("广西壮族自治区", 100) # ✅
("广西", 100) # ❌
# 查看所有可用地图名称
from pyecharts.datasets import register_url
# 参考官方文档查询
3. 数值范围显示问题
# 使用分段型visualmap解决数值分布不均
opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 0, "max": 10, "label": "0-10"},
{"min": 11, "max": 100, "label": "11-100"},
{"min": 101, "label": "101+"},
]
)更多推荐
所有评论(0)