【数据可视化】Pyecharts-家乡地图
目录
项目解析
① 整体结构:导入模块
② 数据准备:结构化你的信息
③ 图表函数详解:封装每一个图表
④ 页面布局与生成:组合与渲染
Pyecharts 核心库与 API 讲解
如何借鉴此项目进行二次创作?
总结与更多资源
开始
地理位置
行政区划
人口数据
经济数据
自然资源
代码构建
导包
数据准备
可视化效果
图表绘制函数
生成网页
完整代码
项目解析
① 整体结构:导入模块
# 导入图表类,如 Map, Bar, Geo 等
from pyecharts.charts import Map, Bar, Geo, Gauge, WordCloud, Page
# 导入全局配置和系列配置项,这是自定义样式的关键
from pyecharts import options as opts
# 导入一些辅助常量,如图表类型、标记形状等
from pyecharts.globals import ChartType, SymbolType
pyecharts.charts: 存放所有图表类型,如 Bar()(柱状图)、Line()(折线图)等;
pyecharts.options (通常简写为 opts): 这是 pyecharts 的精髓。它包含了所有用于定制图表样式的“配置项类”,如图表标题 (opts.TitleOpts)、坐标轴 (opts.AxisOpts)、提示框 (opts.TooltipOpts) 等;
pyecharts.globals: 提供一些全局的枚举值,比如图表类型、主题等。
② 数据准备:结构化你的信息
在代码中,我们先把所有需要展示的数据整理成 Python 的基础数据结构(列表、元组)。
# 例如,人口数据是 [(key, value), (key, value), ...] 的格式
districts_population = [("龙湖区", 630749), ("金平区", 777024), ...
]
# 经济数据是两个对应的列表
gdp_income_data_x = ["GDP(亿元)", "城镇人均收入(元)", ...]
gdp_income_data_y = [3167.97, 39289, ...]
这样做的好处是让数据和绘图逻辑分离,代码更清晰,以后更新数据也只需要修改这一部分。
③ 图表函数详解:封装每一个图表
为每一个图表都创建了一个独立的函数(如 create_map(), create_economy_bar())。这样做的好处是模块化,易于管理和复用。
以经济概览的柱状图为例:
def create_economy_bar() -> Bar:
c = (
Bar() # 1. 创建一个柱状图实例.add_xaxis(gdp_income_data_x) # 2. 添加 X 轴数据.add_yaxis("数值", gdp_income_data_y) # 3. 添加 Y 轴数据,并命名该系列为“数值”.set_global_opts( # 4. 设置全局配置项
title_opts=opts.TitleOpts(title="图3 - 2024年汕头经济概览"), # 设置标题
yaxis_opts=opts.AxisOpts(type_="log", name="数值 (Y轴为对数轴)") # 设置Y轴).set_series_opts( # 5. 设置系列配置项
label_opts=opts.LabelOpts(is_show=True, position="top") # 在柱顶显示数值))return c
.add_xaxis() 和 .add_yaxis():是所有图表用来添加数据的核心方法;
.set_global_opts():用于设置图表级别的选项,如标题、图例、工具箱、视觉映射等。这些设置对整个图表生效;
.set_series_opts():用于设置数据系列级别的选项,比如柱子的颜色、线上标记的样式、标签的格式等。它只对用 .add_yaxis() 添加的那个数据系列生效。
④ 页面布局与生成:组合与渲染
Page 类是一个强大的布局工具。
def main():
# 使用可拖拽布局
page = Page(layout=Page.DraggablePageLayout, page_title="期末大作业 - 我的家乡汕头")
# 将之前创建的所有图表对象加入页面
page.add(
create_map(),
create_geo(),
...
)
# 生成最终的 HTML 文件
page.render("my_hometown_shantou_visualization.html")
Page.DraggablePageLayout: 让生成的 HTML 页面中的所有图表都可以用鼠标自由拖动和缩放,非常适合制作可交互的 Dashboard;
page.render(): 这是最后一步,将所有配置好的图表对象渲染成一个独立的网页文件。
Pyecharts 核心库与 API 讲解
核心设计理念:“配置项皆为对象”
理解 pyecharts 的关键在于理解它的配置方式。你看到的每一个 opts.XXXOpts() 都是在创建一个“配置对象”,然后把它传递给 .set_global_opts() 或 .set_series_opts()。
例如,想改标题,就创建一个 TitleOpts 对象;想改坐标轴,就创建一个 AxisOpts 对象。这种方式非常清晰且灵活。
常用图表与配置项 (opts)
链式调用 (Chain-style Calling)
Bar().add_xaxis(...).add_yaxis(...).set_global_opts(...)
这是 pyecharts 的标志性写法。每个方法执行后都会返回图表对象本身,所以可以继续在后面调用下一个方法,让代码写起来非常流畅、一气呵成。
如何借鉴此项目进行二次创作?
假设要为家乡 “西安” 制作一个类似的可视化项目。
第一步:明确你的主题与数据
首先,收集西安的相关数据。
行政区划与人口:碑林区、新城区等各区的人口。
经济数据:GDP、人均收入。
旅游数据:大雁塔、兵马俑的年游客量。
历史文化:十三朝古都、丝绸之路起点等关键词。
第二步:选择并修改图表函数
可以直接复用项目中的函数,只需修改数据和标题。
例:将汕头经济图改为西安旅游图
复制函数:复制 create_economy_bar() 函数,并重命名为 create_xian_tourism_bar()。
准备新数据:
xian_tourism_x = ["兵马俑(万人次)", "大雁塔(万人次)", "城墙(万人次)"]
xian_tourism_y = [1200, 800, 650] # 假设的数据
修改函数内部:
def create_xian_tourism_bar() -> Bar:
c = (
Bar().add_xaxis(xian_tourism_x) # <-- 使用西安的数据.add_yaxis("年游客量", xian_tourism_y) # <-- 使用西安的数据和系列名.set_global_opts(
title_opts=opts.TitleOpts(title="西安主要景点年游客量对比"), # <-- 修改标题
yaxis_opts=opts.AxisOpts(name="万人次") # <-- 修改Y轴单位).set_series_opts(
label_opts=opts.LabelOpts(is_show=True, position="top")))return c
第三步:组合可视化页面
在 main 函数中,调用你新创建的函数来替换或增加图表。
def main():
page = Page(layout=Page.DraggablePageLayout, page_title="我的家乡 - 西安")# 你可以保留地图,但需要将 maptype 改为 "西安"# page.add(create_xian_map()) # 需要一个西安地图的函数# 添加你新创建的旅游图
page.add(create_xian_tourism_bar())# ...添加其他关于西安的图表 page.render("my_hometown_xian_visualization.html") # 生成新的HTML文件
总结与更多资源
通过这个项目,你可以看到 pyecharts 的核心逻辑就是:准备数据 -> 创建图表 -> 添加数据 -> 配置样式 -> 渲染生成。
它最大的优点是:
简单易用:Python 语法,链式调用非常顺手;
功能强大:支持丰富的图表类型和高度自定义的配置;
交互性强:生成的 HTML 文件是动态的,支持缩放、筛选、提示等交互;
当你想要制作更复杂的图表时,可以访问 Pyecharts 官方文档和示例库
pyecharts - A Python Echarts Plotting Library built with love.
,那里有上百个可以直接运行的例子,是学习和寻找灵感的最佳去处。
开始
先进行数据收集
pyecharts绘制地理图表
- Geo 地理坐标系组件:用于地图的绘制,支持在地理坐标系上绘制散点图,线集。
- Map 函数:主要用于地理区域数据的可视化
用于绘制可视化的信息收集:
地理位置
- 经纬度范围:汕头市全境处于东经116°14′40″至117°19′35″和北纬23°02′33″至23°38′50″之间。
- 地理位置:位于广东省东部,韩江三角洲南端,北接潮州,西邻揭阳,东南濒临南海。
- 地形地貌:汕头市处潮汕平原,仅西北部有小片丘陵。全市最高峰是位于南澳岛的大尖山,海拔587米。
行政区划
汕头市辖6个区、1个县:
| 市辖区 | 面积(平方千米) | 区政府驻地
| 龙湖区 | 125 | 大北山路一号
| 金平区 | 114.64 | 金砂路50号
| 濠江区 | 171.03 | 达濠街道府前路
| 潮阳区 | 665.74 | 中华路136号
| 潮南区 | 600.74 | 峡山街道玉峡南路
| 澄海区 | 382.93 | 文冠路党政大楼
| 南澳县 | 112.049 | 后宅镇隆澳大街
人口数据
- 常住人口:2025年初常住人口为557.55万人。
- 户籍人口:2024年初户籍人口为579.3421万人。
- 人口密度:约为2624人/平方公里。
- 城镇化率:2024年末为71.15%。
经济数据
- GDP:2024年汕头市生产总值为3167.97亿元。
- 居民收入:2024年城镇居民可支配收入为39289元,农村居民可支配收入为23891元。
自然资源
- 海岸线:大陆海岸线长217.7公里,海岛岸线长167.37公里,有大小岛屿82个。
- 气候:属于亚热带季风气候,常年气候温和,热量丰富,阳光充足,雨量充沛。
代码构建
导包
# 导入所需的库和模块
from pyecharts import options as opts
from pyecharts.charts import Map, Bar, Geo, Gauge, WordCloud, Page
from pyecharts.globals import ChartType, SymbolType
数据准备
# 1. 行政区划 & 人口数据
districts_population = [
("龙湖区", 630749), ("金平区", 777024), ("濠江区", 269471),
("潮阳区", 1654276), ("潮南区", 1231638), ("澄海区", 874444),
("南澳县", 64429)
]# 2. 经济数据
gdp_income_data_x = ["GDP(亿元)", "城镇人均收入(元)", "农村人均收入(元)"]
gdp_income_data_y = [3167.97, 39289, 23891]# 3. 人口数据
population_total_x = ["常住人口(万人)", "户籍人口(万人)"]
population_total_y = [557.55, 579.34]# 4. 城镇化率
urbanization_rate = 71.15# 5. 自然资源
natural_resources_x = ["大陆海岸线(km)", "海岛岸线(km)", "岛屿数量(个)"]
natural_resources_y = [217.7, 167.37, 82]# 6. 气候特点
climate_words = [
("温和湿润", 100), ("阳光充足", 95), ("雨量充沛", 90),
("热量丰富", 85), ("亚热带季风气候", 80)
]
可视化效果
图表绘制函数
# 1. 汕头人口分布地图
def create_map() -> Map:
c = (
Map() # 旧版:InitOpts 不放在这里
.add("常住人口", districts_population, "汕头", is_map_symbol_show=False)
.set_global_opts(
title_opts=opts.TitleOpts(title="图1 - 汕头市各区人口分布图"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 1500000, "label": "> 150万", "color": "#8A0808"},
{"min": 1000000, "max": 1499999, "label": "100-150万", "color": "#B40404"},
{"min": 500000, "max": 999999, "label": "50-100万", "color": "#DF0101"},
{"min": 100000, "max": 499999, "label": "10-50万", "color": "#F78181"},
{"max": 99999, "label": "< 10万", "color": "#F5A9A9"},
],
)
)
)
return c
2. 汕头最高峰示意图 (Geo)
def create_geo() -> Geo:
c = (
Geo()
.add_schema(maptype="汕头")
.add(
"大尖山 (海拔587m)",
[("南澳县", 587)],
type_=ChartType.EFFECT_SCATTER,
symbol_size=15,
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="图2 - 汕头市最高峰位置示意"),
tooltip_opts=opts.TooltipOpts(formatter="{b}"),
)
)
return c
# 3. 经济概览柱状图
def create_economy_bar() -> Bar:
c = (
Bar()
.add_xaxis(gdp_income_data_x)
.add_yaxis("数值", gdp_income_data_y, category_gap="50%")
.set_global_opts(
title_opts=opts.TitleOpts(title="图3 - 2024年汕头经济概览"),
yaxis_opts=opts.AxisOpts(
type_="log", name="数值 (Y轴为对数轴)"
),
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis", axis_pointer_type="cross"
),
)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=True, position="top")
)
)
return c
# 4. 城镇化率仪表盘
def create_urbanization_gauge() -> Gauge:
c = (
Gauge()
.add(
"城镇化率",
[(" ", urbanization_rate)],
detail_label_opts=opts.LabelOpts(formatter="{value}%")
)
.set_global_opts(
title_opts=opts.TitleOpts(title="图4 - 2024年末城镇化率")
)
)
return c
# 5. 人口结构对比图
def create_population_bar() -> Bar:
c = (
Bar()
.add_xaxis(population_total_x)
.add_yaxis("人口数量", population_total_y)
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(
title_opts=opts.TitleOpts(title="图5 - 汕头人口结构")
)
)
return c
# 6. 自然资源与气候词云
def create_resources_bar() -> Bar:
c = (
Bar()
.add_xaxis(natural_resources_x)
.add_yaxis("数值", natural_resources_y)
.set_global_opts(
title_opts=opts.TitleOpts(title="图6 - 汕头自然资源"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15))
)
)
return cdef create_climate_wordcloud() -> WordCloud:
c = (
WordCloud()
.add("气候", climate_words, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
.set_global_opts(
title_opts=opts.TitleOpts(title="图7 - 汕头气候特点")
)
)
return c
生成网页
# --- 页面布局与渲染 ---
def main():
# 使用 Page 进行自由布局
page = Page(layout=Page.DraggablePageLayout, page_title="家乡汕头") # 将所有图表添加到页面中
page.add(
create_map(),
create_geo(),
create_economy_bar(),
create_urbanization_gauge(),
create_population_bar(),
create_resources_bar(),
create_climate_wordcloud(),
) # 渲染生成 HTML 文件
page.render("my_hometown_shantou_visualization.html") print("可视化报告已生成: my_hometown_shantou_visualization.html")
print("请用浏览器打开查看。页面内的图表可以自由拖动和缩放!")if __name__ == "__main__":
main()
完整代码
# 导入所需的库和模块
from pyecharts import options as opts
from pyecharts.charts import Map, Bar, Geo, Gauge, WordCloud, Page
from pyecharts.globals import ChartType, SymbolType# --- 数据准备 ---# 1. 行政区划 & 人口数据
districts_population = [("龙湖区", 630749), ("金平区", 777024), ("濠江区", 269471),("潮阳区", 1654276), ("潮南区", 1231638), ("澄海区", 874444),("南澳县", 64429)
]# 2. 经济数据
gdp_income_data_x = ["GDP(亿元)", "城镇人均收入(元)", "农村人均收入(元)"]
gdp_income_data_y = [3167.97, 39289, 23891]# 3. 人口数据
population_total_x = ["常住人口(万人)", "户籍人口(万人)"]
population_total_y = [557.55, 579.34]# 4. 城镇化率
urbanization_rate = 71.15# 5. 自然资源
natural_resources_x = ["大陆海岸线(km)", "海岛岸线(km)", "岛屿数量(个)"]
natural_resources_y = [217.7, 167.37, 82]# 6. 气候特点
climate_words = [("温和湿润", 100), ("阳光充足", 95), ("雨量充沛", 90),("热量丰富", 85), ("亚热带季风气候", 80)
]# --- 图表绘制 (已适配旧版 Pyecharts) ---# 1. 汕头人口分布地图
def create_map() -> Map:
c = (
Map() # 旧版:InitOpts 不放在这里.add("常住人口", districts_population, "汕头", is_map_symbol_show=False).set_global_opts(
title_opts=opts.TitleOpts(title="图1 - 汕头市各区人口分布图"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[{"min": 1500000, "label": "> 150万", "color": "#8A0808"},{"min": 1000000, "max": 1499999, "label": "100-150万", "color": "#B40404"},{"min": 500000, "max": 999999, "label": "50-100万", "color": "#DF0101"},{"min": 100000, "max": 499999, "label": "10-50万", "color": "#F78181"},{"max": 99999, "label": "< 10万", "color": "#F5A9A9"},],)))return c# 2. 汕头最高峰示意图 (Geo)
def create_geo() -> Geo:
c = (
Geo().add_schema(maptype="汕头").add("大尖山 (海拔587m)",[("南澳县", 587)],
type_=ChartType.EFFECT_SCATTER,
symbol_size=15,).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(
title_opts=opts.TitleOpts(title="图2 - 汕头市最高峰位置示意"),
tooltip_opts=opts.TooltipOpts(formatter="{b}"),))return c# 3. 经济概览柱状图
def create_economy_bar() -> Bar:
c = (
Bar().add_xaxis(gdp_income_data_x).add_yaxis("数值", gdp_income_data_y, category_gap="50%").set_global_opts(
title_opts=opts.TitleOpts(title="图3 - 2024年汕头经济概览"),
yaxis_opts=opts.AxisOpts(
type_="log", name="数值 (Y轴为对数轴)"),
tooltip_opts=opts.TooltipOpts(
is_show=True, trigger="axis", axis_pointer_type="cross"),).set_series_opts(
label_opts=opts.LabelOpts(is_show=True, position="top")))return c# 4. 城镇化率仪表盘
def create_urbanization_gauge() -> Gauge:
c = (
Gauge().add("城镇化率",[(" ", urbanization_rate)],
detail_label_opts=opts.LabelOpts(formatter="{value}%")).set_global_opts(
title_opts=opts.TitleOpts(title="图4 - 2024年末城镇化率")))return c# 5. 人口结构对比图
def create_population_bar() -> Bar:
c = (
Bar().add_xaxis(population_total_x).add_yaxis("人口数量", population_total_y).reversal_axis().set_series_opts(label_opts=opts.LabelOpts(position="right")).set_global_opts(
title_opts=opts.TitleOpts(title="图5 - 汕头人口结构")))return c# 6. 自然资源与气候词云
def create_resources_bar() -> Bar:
c = (
Bar().add_xaxis(natural_resources_x).add_yaxis("数值", natural_resources_y).set_global_opts(
title_opts=opts.TitleOpts(title="图6 - 汕头自然资源"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15))))return cdef create_climate_wordcloud() -> WordCloud:
c = (
WordCloud().add("气候", climate_words, word_size_range=[20, 100], shape=SymbolType.DIAMOND).set_global_opts(
title_opts=opts.TitleOpts(title="图7 - 汕头气候特点")))return c# --- 页面布局与渲染 ---
def main():# 使用 Page 进行自由布局
page = Page(layout=Page.DraggablePageLayout, page_title="期末大作业 - 我的家乡汕头")# 将所有图表添加到页面中
page.add(
create_map(),
create_geo(),
create_economy_bar(),
create_urbanization_gauge(),
create_population_bar(),
create_resources_bar(),
create_climate_wordcloud(),)# 渲染生成 HTML 文件
page.render("my_hometown_shantou_visualization.html")print("可视化报告已生成: my_hometown_shantou_visualization.html")print("请用浏览器打开查看。页面内的图表可以自由拖动和缩放!")if __name__ == "__main__":
main()