当前位置: 首页 > java >正文

【数据可视化】Pyecharts-家乡地图

目录

项目解析

① 整体结构:导入模块

② 数据准备:结构化你的信息

③ 图表函数详解:封装每一个图表

④ 页面布局与生成:组合与渲染

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 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()

http://www.xdnf.cn/news/14275.html

相关文章:

  • 从0开始学习语言模型--Day02-如何最大化利用硬件
  • Python OpenCV 4.10 库详解
  • 中科院医学1区Top:解放军医学院利用多组学+网络药理学+转录组测序联合解析苗药七角生白胶囊抗白细胞减少症的分子机制
  • AORSA编译指南
  • 探索niri:让你的Linux桌面布局无拘无束
  • HTTP 协议里15种请求方法及示例
  • 无监督 vs 有监督的本质区别
  • 数据赋能(256)——数据赋能业务——产品和服务变现
  • Linux 命令:source 用法详解与直接执行脚本的区别
  • 2.7 Conan简单使用
  • open GL 和 vulkan
  • Docker容器中运行OpenMPI并行程序, 参数调优
  • 嵌入式学习笔记 - HAL库对外设的封装
  • 【Linux命令】查看内核版本命令
  • C++批量读取指定后缀文件
  • 【C++进阶篇】哈希的应用(位图)
  • 深度解析Vue.js组件开发与实战案例
  • 商用密码基础知识介绍(上)
  • python与java的区别
  • 深入解析ReentrantReadWriteLock读写锁机制
  • 【python深度学习】Day53 对抗生成网络
  • 人工智能学习23-BP-图像编码
  • c++编译第三方项目报错# pragma warning( disable: 4273)
  • HTML5白云飘飘动态效果教程
  • 华为云Flexus+DeepSeek征文 | 基于华为云Dify-LLM应用开发平台构建写作助手
  • 达梦分布式集群DPC_DPC的执行计划新增操作符详解_yxy
  • 区间合并:牛奶
  • 【慢摹】TRL训练器细节详解(SFT/PPO/DPO/GRPO)
  • 自用方案总结
  • 如何在 Elementary OS 上安装 Snap Store