【数据可视化-112】使用PyEcharts绘制TreeMap(矩形树图)完全指南及电商销售数据TreeMap绘制实战

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

【数据可视化-112】使用PyEcharts绘制TreeMap(矩形树图)完全指南及电商销售数据TreeMap绘制实战

    • 一、引言
    • 二、TreeMap简介
    • 三、基本TreeMap绘制
      • [3.1 简单示例](#3.1 简单示例)
      • [3.2 数据格式详解](#3.2 数据格式详解)
        • [3.2.1 扁平结构](#3.2.1 扁平结构)
        • [3.2.2 层次结构](#3.2.2 层次结构)
    • 四、高级TreeMap示例
      • [4.1 带钻取功能的TreeMap](#4.1 带钻取功能的TreeMap)
      • [4.2 多层级样式配置](#4.2 多层级样式配置)
    • 五、参数详解
      • [5.1 add() 方法参数](#5.1 add() 方法参数)
      • [5.2 标签配置 (LabelOpts)](#5.2 标签配置 (LabelOpts))
      • [5.3 视觉映射配置 (VisualMapOpts)](#5.3 视觉映射配置 (VisualMapOpts))
      • [5.4 层级样式配置 (TreeMapLevelsOpts)](#5.4 层级样式配置 (TreeMapLevelsOpts))
    • 六、完整示例与实战
    • 七、总结

一、引言

TreeMap(矩形树图)是一种流行的数据可视化方式,它通过嵌套的矩形来展示层次结构数据,每个矩形的面积大小与数据值成比例。本文将详细介绍如何使用PyEcharts库绘制TreeMap,并深入解析数据格式和各个参数的含义。

二、TreeMap简介

TreeMap是一种有效的空间填充可视化方法,特别适合展示具有层次结构的大规模数据。它能够同时显示数据的层次关系和数值大小,广泛应用于文件大小分析、市场份额展示、资源配置等领域。

三、基本TreeMap绘制

3.1 简单示例

首先,我们来看一个基本的TreeMap绘制示例:

python 复制代码
from pyecharts import options as opts
from pyecharts.charts import TreeMap

# 基本数据格式
data = [
    {"value": 40, "name": "类别A"},
    {"value": 30, "name": "类别B"},
    {"value": 20, "name": "name": "类别C"},
    {"value": 10, "name": "类别D"},
]

# 创建TreeMap实例
treemap = (
    TreeMap()
    .add("演示数据", data)
    .set_global_opts(title_opts=opts.TitleOpts(title="基本TreeMap示例"))
)

treemap.render("basic_treemap.html")

3.2 数据格式详解

TreeMap的数据格式可以是扁平结构或层次结构:

3.2.1 扁平结构
python 复制代码
data = [
    {"value": 40, "name": "类别A"},
    {"value": 30, "name": "类别B"},
    {"value": 20, "name": "类别C"},
    {"value": 10, "name": "类别D"},
]
3.2.2 层次结构
python 复制代码
data = [
    {
        "name": "类别A",
        "value": 40,
        "children": [
            {"name": "子类A1", "value": 25},
            {"name": "子类A2", "value": 15},
        ]
    },
    {
        "name": "类别B", 
        "value": 30,
        "children": [
            {"name": "子类B1", "value": 20},
            {"name": "子类B2", "value": 10},
        ]
    }
]

每个数据项可以包含以下属性:

  • name: 数据项名称
  • value: 数据项数值,决定矩形大小
  • children: 子节点数组(可选)
  • 其他自定义属性,可用于视觉映射

四、高级TreeMap示例

4.1 带钻取功能的TreeMap

下面的示例展示了如何创建带钻取功能的TreeMap,类似于Echarts官方示例,参考链接https://gallery.pyecharts.org/#/Treemap/echarts_option_query:

python 复制代码
import re
import asyncio
from aiohttp import TCPConnector, ClientSession
import pyecharts.options as opts
from pyecharts.charts import TreeMap

async def get_json_data(url: str) -> dict:
    async with ClientSession(connector=TCPConnector(ssl=False)) as session:
        async with session.get(url=url) as response:
            return await response.json()

# 获取官方的数据
data = asyncio.run(
    get_json_data(
        url="https://echarts.apache.org/examples/data/asset/data/"
        "ec-option-doc-statistics-201604.json"
    )
)

tree_map_data: dict = {"children": []}

def convert(source, target, base_path: str):
    for key in source:
        if base_path != "":
            path = base_path + "." + key
        else:
            path = key
        if re.match(r"/^\$/", key):
            pass
        else:
            child = {"name": path, "children": []}
            target["children"].append(child)
            if isinstance(source[key], dict):
                convert(source[key], child, path)
            else:
                target["value"] = source["$count"]

convert(source=data, target=tree_map_data, base_path="")

(
    TreeMap(init_opts=opts.InitOpts(width="1200px", height="720px"))
    .add(
        series_name="option",
        data=tree_map_data["children"],
        visual_min=300,
        leaf_depth=1,
        # 标签居中为 position = "inside"
        label_opts=opts.LabelOpts(position="inside"),
    )
    .set_global_opts(
        legend_opts=opts.LegendOpts(is_show=False),
        title_opts=opts.TitleOpts(
            title="Echarts 配置项查询分布", subtitle="2016/04", pos_left="leafDepth"
        ),
    )
    .render("echarts_option_query.html")
)

4.2 多层级样式配置

下面的示例展示了如何为不同层级配置不同的样式,参考链接:https://gallery.pyecharts.org/#/Treemap/treemap_levels

python 复制代码
import json
from pyecharts import options as opts
from pyecharts.charts import TreeMap

# 假设我们有一个包含层次结构数据的JSON文件
# 数据格式示例:
# [
#   {
#     "name": "类别A",
#     "value": 100,
#     "children": [
#       {"name": "子类A1", "value": 60},
#       {"name": "子类A2", "value": 40}
#     ]
#   },
#   {
#     "name": "类别B", 
#     "value": 80,
#     "children": [
#       {"name": "子类B1", "value": 50},
#       {"name": "子类B2", "value": 30}
#     ]
#   }
# ]

with open("treemap.json", "r", encoding="utf-8") as f:
    data = json.load(f)
    
c = (
    TreeMap()
    .add(
        series_name="演示数据",
        data=data,
        levels=[
            opts.TreeMapLevelsOpts(
                treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                    border_color="#555", border_width=4, gap_width=4
                )
            ),
            opts.TreeMapLevelsOpts(
                color_saturation=[0.3, 0.6],
                treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                    border_color_saturation=0.7, gap_width=2, border_width=2
                ),
            ),
            opts.TreeMapLevelsOpts(
                color_saturation=[0.3, 0.5],
                treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                    border_color_saturation=0.6, gap_width=1
                ),
            ),
            opts.TreeMapLevelsOpts(color_saturation=[0.3, 0.5]),
        ],
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="TreeMap-Levels-配置"))
    .render("treemap_levels.html")
)

五、参数详解

5.1 add() 方法参数

.add() 方法是TreeMap的核心配置方法,主要参数包括:

  • series_name: 系列名称,用于提示框显示
  • data: 数据数组,支持扁平结构和层次结构
  • leaf_depth: 显示到第几层,默认为无限层级
  • pos_left, pos_right, pos_top, pos_bottom: TreeMap组件的位置
  • size: TreeMap组件尺寸
  • label_opts: 标签配置
  • tooltip_opts: 提示框配置
  • visual_min, visual_max: 视觉映射的最小/最大值

5.2 标签配置 (LabelOpts)

标签配置控制矩形中文本的显示方式:

python 复制代码
label_opts=opts.LabelOpts(
    position="inside",  # 位置:inside, top, left, right, bottom
    formatter="{b}: {c}",  # 格式化器:{b}名称, {c}数值, {d}百分比
    color="#fff",  # 文字颜色
    font_size=12,  # 字体大小
    font_style="normal",  # 字体样式:normal, italic, oblique
    font_weight="bold",  # 字体粗细:normal, bold, bolder, lighter
    rotate=0,  # 旋转角度
    margin=8,  # 边距
    is_show=True  # 是否显示
)

5.3 视觉映射配置 (VisualMapOpts)

视觉映射可以将数据值映射到颜色:

python 复制代码
visual_map_opts=opts.VisualMapOpts(
    is_show=True,  # 是否显示视觉映射组件
    dimension=0,  # 指定用数据的哪个维度做映射
    min_=10,  # 允许的最小值
    max_=100,  # 允许的最大值
    range_color=["#313695", "#4575b4", "#74add1", "#abd9e9", "#e0f3f8", 
                 "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027", "#a50026"],
    # 颜色过渡序列
    is_calculable=True,  # 是否显示拖拽用的手柄
    orient="vertical",  # 方向:vertical, horizontal
    pos_left="left",  # 位置
    pos_top="center"  # 位置
)

5.4 层级样式配置 (TreeMapLevelsOpts)

可以为不同层级配置不同的样式:

python 复制代码
levels=[
    # 第一层级样式
    opts.TreeMapLevelsOpts(
        treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
            border_color="#555",  # 边框颜色
            border_width=4,  # 边框宽度
            gap_width=4  # 间隙宽度
        )
    ),
    # 第二层级样式
    opts.TreeMapLevelsOpts(
        color_saturation=[0.3, 0.6],  # 颜色饱和度范围
        treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
            border_color_saturation=0.7,  # 边框颜色饱和度
            gap_width=2,  # 间隙宽度
            border_width=2  # 边框宽度
        ),
    ),
    # 更多层级...
]

六、完整示例与实战

下面是一个完整的实战示例,展示如何使用TreeMap可视化电商销售数据:

python 复制代码
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import TreeMap

# 模拟电商销售数据(与之前相同)
data = [
    {
        "name": "电子产品",
        "value": 10000,
        "children": [
            {"name": "手机", "value": 6000, "children": [
                {"name": "iPhone", "value": 3500},
                {"name": "三星", "value": 1500},
                {"name": "华为", "value": 1000}
            ]},
            {"name": "电脑", "value": 3000, "children": [
                {"name": "笔记本", "value": 2000},
                {"name": "台式机", "value": 1000}
            ]},
            {"name": "配件", "value": 1000, "children": [
                {"name": "耳机", "value": 600},
                {"name": "充电器", "value": 400}
            ]}
        ]
    },
    {
        "name": "服装",
        "value": 8000,
        "children": [
            {"name": "男装", "value": 4000, "children": [
                {"name": "上衣", "value": 2000},
                {"name": "裤子", "value": 1500},
                {"name": "鞋", "value": 500}
            ]},
            {"name": "女装", "value": 4000, "children": [
                {"name": "上衣", "value": 2500},
                {"name": "裙子", "value": 1000},
                {"name": "鞋", "value": 500}
            ]}
        ]
    },
    {
        "name": "家居",
        "value": 5000,
        "children": [
            {"name": "家具", "value": 3000},
            {"name": "家纺", "value": 1500},
            {"name": "装饰", "value": 500}
        ]
    }
]

# 创建TreeMap(修改了VisualMapOpts的range_color)
treemap = (
    TreeMap(init_opts=opts.InitOpts(width="1200px", height="600px", theme="dark"))
    .add(
        series_name="销售数据",
        data=data,
        levels=[
            opts.TreeMapLevelsOpts(
                treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                    border_color="#000", 
                    border_width=2, 
                    gap_width=3
                )
            ),
            opts.TreeMapLevelsOpts(
                treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                    border_color="#333", 
                    border_width=1, 
                    gap_width=2
                )
            ),
            opts.TreeMapLevelsOpts(
                treemap_itemstyle_opts=opts.TreeMapItemStyleOpts(
                    border_color="#666", 
                    gap_width=1
                )
            ),
        ],
        label_opts=opts.LabelOpts(
            position="inside",
            formatter="{b}\n{c}",
            color="#fff",
            font_size=12
        ),
        tooltip_opts=opts.TooltipOpts(
            formatter="{b}: {c}元"
        )
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(
            title="电商销售数据分布",
            subtitle="按品类和子品类划分",
            pos_left="center",
            title_textstyle_opts=opts.TextStyleOpts(color="#fff"),
            subtitle_textstyle_opts=opts.TextStyleOpts(color="#ccc")
        ),
        legend_opts=opts.LegendOpts(is_show=False),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,
            min_=500,
            max_=10000,
            range_color=[
                "#FF0000", "#FF7F00", "#FFFF00",  # 红色到黄色的高对比度颜色
                "#00FF00", "#0000FF", "#4B0082"   # 绿色、蓝色到深紫色的高对比度颜色
            ],
            orient="vertical",
            pos_left="10",
            pos_bottom="20"
        )
    )
)

treemap.render("ecommerce_sales_treemap_vivid.html")

七、总结

TreeMap是一种强大的数据可视化工具,特别适合展示层次结构数据和比例关系。PyEcharts提供了丰富的配置选项,可以创建高度定制化的TreeMap图表。

关键要点:

  1. TreeMap数据可以是扁平结构或层次结构
  2. 可以使用label_opts配置标签显示方式
  3. 可以使用levels参数为不同层级配置不同样式
  4. 可以使用visual_map_opts实现数据到颜色的映射
  5. TreeMap支持交互功能,如点击钻取、悬停提示等

通过合理配置这些参数,可以创建出既美观又实用的TreeMap图表,有效展示复杂的数据关系。


相关推荐
ACEEE12223 小时前
Stanford CS336 | Assignment 2 - FlashAttention-v2 Pytorch & Triotn实现
人工智能·pytorch·python·深度学习·机器学习·nlp·transformer
NG WING YIN3 小时前
Golang關於信件的
开发语言·深度学习·golang
TwoAI3 小时前
Pandas 数据分析:从入门到精通的数据处理核心
数据挖掘·数据分析·pandas
Sunny_yiyi3 小时前
Java根据模版导出PDF文件
java·开发语言·pdf
橘子133 小时前
C++实战:搜索引擎项目(二)
开发语言·c++·搜索引擎
iChochy3 小时前
[开源免费] iGTTS(Gemini TTS) 文本转语音(TTS)的命令行工具。
python·tts·gemini
TwoAI3 小时前
Scikit-learn:从零开始构建你的第一个机器学习模型
python·机器学习·scikit-learn
跟橙姐学代码3 小时前
Python里的“管家婆”:带你玩转os库的所有神操作
前端·python·ipython
倔强青铜三3 小时前
最强Python Web框架到底是谁?
人工智能·python·面试