目录
[① 整体结构:导入模块](#① 整体结构:导入模块)
[② 数据准备:结构化你的信息](#② 数据准备:结构化你的信息)
[③ 图表函数详解:封装每一个图表](#③ 图表函数详解:封装每一个图表)
[④ 页面布局与生成:组合与渲染](#④ 页面布局与生成:组合与渲染)
[Pyecharts 核心库与 API 讲解](#Pyecharts 核心库与 API 讲解)
前言
Pyecharts 是基于 Python 的开源可视化库,可生成交互式图表。数据可视化通过图表等形式呈现数据,二者结合能将复杂数据转化为直观图形,广泛应用于商业分析(如销售趋势展示)、学术研究(如数据模型可视化)、政务决策(如人口分布呈现)等场景,助力高效信息传递与决策支持。
项目解析
① 整体结构:导入模块
# 导入图表类,如 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 c`
`def 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 c`
`def` `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()`
`