Python 数据可视化进阶:Pyecharts 复杂图表案例实战详解

 前言

pyecharts 是一个基于 Echarts 的强大 Python 图表库,它以其丰富的图表类型、灵活的配置项和出色的交互性,成为数据可视化领域的首选工具。

本文精选了五个案例来演示如何使用 pyecharts 绘制复杂且具有专业水准的图表,并在 Jupyter Notebook 中直接呈现。所有案例的数据均通过随机种子生成,确保代码的可复现性。每个案例都提供完整的 Python 代码、注释,助大家轻松掌握 pyecharts 的高级绘图技巧,并在您的数据分析项目中高效应用。


包含编程资料、学习路线图、源代码、软件安装包等!【点击这里免费领取】!


准备工作

在开始之前,请确保您已经在您的 Python 环境中安装了 pyecharts 库。如果您还没有安装,可运行以下命令进行安装:

pip install pyecharts

为了生成可复现的随机数据,我们将使用 Python 的 random 模块并设置随机种子。在每个案例代码的开头,您都会看到以下代码,以确保每次运行代码时生成的数据和图表一致:

import random

random.seed(42) # 设置随机种子为 42,保证每次运行结果一致

Jupyter Notebook 运行说明

本文提供的所有代码示例都设计为可以在 Jupyter Notebook 中直接运行。您只需将代码复制到 Jupyter Notebook 的代码单元格中,然后执行该单元格,pyecharts 生成的图表将会直接在单元格的下方输出显示。无需额外的配置或导出操作,即可在 Jupyter Notebook 中方便地查看和交互操作这些复杂图表。

案例一: 关系图 (Graph Chart)

关系图用于展示数据节点之间的复杂关系网络,例如社交网络、知识图谱、组织结构等。pyecharts 关系图功能强大,支持自定义节点样式、连接线样式和布局算法。

from pyecharts import options as opts
from pyecharts.charts import Graph
import random

random.seed(42)

# 生成随机节点数据
nodes = []
for i in range(30): # 生成 30 个节点
    nodes.append(
        {
            "id": f"节点{i+1}", # 节点 ID
            "name": f"节点{i+1}", # 节点名称,用于标签显示
            "symbolSize": random.randint(10, 50), # 节点大小,随机生成
            "itemStyle": {"color": f"rgb({random.randint(0,255)}, {random.randint(0,255)}, {random.randint(0,255)})"}, # 节点颜色,随机 RGB 值
            "label": opts.LabelOpts(formatter="{b}", position="inside"), # 标签配置,显示节点名称并居中
        }
    )

# 生成随机连接数据
links = []
for i in range(60): # 生成 60 条连接
    source_index = random.randint(0, 29) # 随机选择源节点索引
    target_index = random.randint(0, 29) # 随机选择目标节点索引
    if source_index != target_index: # 避免节点连接到自身
        links.append(
            {
                "source": f"节点{source_index+1}", # 源节点 ID
                "target": f"节点{target_index+1}", # 目标节点 ID
                "lineStyle": {"color": "source", "width": random.randint(1, 5)}, # 连接线样式,颜色与源节点一致,宽度随机
            }
        )

# 创建关系图对象
c = (
    Graph()
    .add("", nodes, links, repulsion=5000, layout="force") # 添加数据,repulsion 设置节点斥力,layout 设置布局算法为力引导布局
    .set_global_opts(title_opts=opts.TitleOpts(title="复杂关系网络图")) # 设置全局标题
)
c.render_notebook() # 在 Jupyter Notebook 中直接渲染图表
  • nodes: 定义关系图中的节点列表,每个节点是字典,包含 id(唯一标识符), name(节点名称), symbolSize(节点大小), itemStyle(节点样式,这里设置随机颜色), label(标签配置,显示节点名称并居中)。

  • links: 定义节点之间连接的列表,每个连接是字典,包含 source(源节点 ID), target(目标节点 ID), lineStyle(连接线样式,颜色与源节点一致,宽度随机)。

  • .add("", nodes, links, repulsion=5000, layout="force"): 添加关系图的数据。

    • repulsion=5000: 设置节点之间的斥力系数,数值越大,节点之间排斥力越强,布局更分散。

    • layout="force": 指定使用力引导布局算法,节点会根据彼此之间的连接关系自动布局,形成网络结构。

  • .set_global_opts(title_opts=opts.TitleOpts(title="复杂关系网络图")): 设置全局标题。

  • c.render_notebook(): 在 Jupyter Notebook 中渲染并展示关系图。

图片

案例二: 3D 散点图 (3D Scatter Chart)

3D 散点图用于可视化三维空间中的数据点分布,可以直观展示数据点在三维空间中的位置和密度,适用于分析三维数据的空间模式和关系。

from pyecharts import options as opts
from pyecharts.charts import Scatter3D
import random

random.seed(42)

# 生成随机 3D 数据
data = []
for i in range(100): # 生成 100 个数据点
    x = random.randint(0, 100) # 随机 X 坐标
    y = random.randint(0, 100) # 随机 Y 坐标
    z = random.randint(0, 100) # 随机 Z 坐标
    value = x + y + z # 计算数值,用于颜色映射
    data.append([x, y, z, value]) # 添加数据点,包含 X, Y, Z 坐标和数值

# 创建 3D 散点图对象
c = (
    Scatter3D()
    .add(
        "3D 散点示例",
        data,
        xaxis3d_opts=opts.Axis3DOpts(name="X 轴"), # 设置 X 轴配置
        yaxis3d_opts=opts.Axis3DOpts(name="Y 轴"), # 设置 Y 轴配置
        zaxis3d_opts=opts.Axis3DOpts(name="Z 轴"), # 设置 Z 轴配置
    )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            max_=300, min_=0, range_color=["#313695", "#4575b4", "#abd9e9", "#fdae61", "#d7191c"] # 设置视觉映射,颜色范围
        ),
        title_opts=opts.TitleOpts(title="复杂 3D 散点图"), # 设置全局标题
    )
)
c.render_notebook() # 在 Jupyter Notebook 中直接渲染图表
  • Scatter3D(): 创建 3D 散点图对象,用于绘制三维散点图。

  • .add("3D 散点示例", data, ...): 添加数据系列,data 是包含三维坐标和数值的列表,每个数据点形如 [x, y, z, value],其中 value 用于颜色映射。

  • xaxis3d_optsyaxis3d_optszaxis3d_opts: 分别配置 X, Y, Z 三个坐标轴的属性,例如 name 设置坐标轴名称。

  • .set_global_opts(visualmap_opts=opts.VisualMapOpts(...)): 配置全局视觉映射组件,range_color 设置颜色范围,将数值映射到不同的颜色梯度,以表示数值大小。

  • c.render_notebook(): 在 Jupyter Notebook 中渲染并显示 3D 散点图。

图片

案例三: 组合图表 (Combined Chart - Line + Bar)

组合图表可以将多种图表类型结合在一起,例如折线图和柱状图,以便在一个图表中同时展示不同类型的数据,或者突出不同数据集之间的对比关系。

from pyecharts import options as opts
from pyecharts.charts import Bar, Line
import random

random.seed(42)

# 生成随机数据
categories = [f"类别{i+1}"for i in range(10)] # 生成 10 个类别名称
bar_data = [random.randint(50, 200) for _ in range(10)] # 生成柱状图数据,每个类别对应一个随机值
line_data = [random.randint(20, 150) for _ in range(10)] # 生成折线图数据,每个类别对应一个随机值

# 创建柱状图对象
bar = Bar()
bar.add_xaxis(categories) # 添加 X 轴数据,即类别名称列表
bar.add_yaxis("柱状图数据", bar_data) # 添加柱状图数据系列,系列名称为 "柱状图数据",数据为 bar_data

# 创建折线图对象
line = Line()
line.add_xaxis(categories) # 添加 X 轴数据,与柱状图共用相同的 X 轴
line.add_yaxis("折线图数据", line_data) # 添加折线图数据系列,系列名称为 "折线图数据",数据为 line_data

# 组合图表
bar.overlap(line) # 将折线图 line 对象覆盖到柱状图 bar 对象之上,实现图表组合

bar.set_global_opts(
    title_opts=opts.TitleOpts(title="柱状图与折线图组合示例"), # 设置全局标题
    tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), # 配置提示框,trigger="axis" 轴触发,axis_pointer_type="cross" 交叉轴指示器
)
bar.render_notebook() # 在 Jupyter Notebook 中直接渲染图表
  • Bar() 和 Line(): 分别创建柱状图和折线图对象,用于绘制组合图中的柱状图和折线图部分。

  • bar.add_xaxis(categories) 和 line.add_xaxis(categories):  为柱状图和折线图添加相同的 X 轴数据,即类别名称列表 categories,确保两个图表共享同一个 X 轴。

  • bar.add_yaxis("柱状图数据", bar_data) 和 line.add_yaxis("折线图数据", line_data): 分别为柱状图和折线图添加各自的数据系列,并指定系列名称。

  • bar.overlap(line)组合图的关键步骤,使用 overlap 方法将折线图对象 line 覆盖到柱状图对象 bar 上,从而实现柱状图和折线图的组合显示。

  • tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"): 配置提示框,设置为轴触发 (trigger="axis"),并启用交叉轴指示器 (axis_pointer_type="cross"),当鼠标悬停在图表上时,会显示交叉轴线和数据提示信息。

  • bar.render_notebook():  在 Jupyter Notebook 中渲染并显示组合图表。

图片

案例四: 漏斗图 (Funnel Chart)

漏斗图适用于展示业务流程中各个环节的数据转化率,例如网站用户从访问到最终购买的转化、销售线索从潜在客户到成交客户的转化等。漏斗的形状直观地反映了流程中各个环节的损耗情况。

from pyecharts import options as opts
from pyecharts.charts import Funnel
import random

random.seed(42)

# 生成随机漏斗图数据
data = [
    ("访问", random.randint(300, 500)), # 访问环节数据
    ("浏览", random.randint(200, 300)), # 浏览环节数据
    ("咨询", random.randint(100, 200)), # 咨询环节数据
    ("下单", random.randint(50, 100)),  # 下单环节数据
    ("支付", random.randint(20, 50)),   # 支付环节数据
]
data.sort(key=lambda x: x[1], reverse=True) # 数据排序,保证漏斗图的视觉效果

# 创建漏斗图对象
c = (
    Funnel()
    .add("商品转化率", data, label_opts=opts.LabelOpts(position="inside")) # 添加数据系列,设置标签显示在漏斗内部
    .set_global_opts(title_opts=opts.TitleOpts(title="商品销售转化漏斗图")) # 设置全局标题
)
c.render_notebook() # 在 Jupyter Notebook 中直接渲染图表
  • Funnel(): 创建漏斗图对象。

  • data:  定义漏斗图的数据,为一个列表,列表中的每个元素是一个元组,包含两个值:环节名称和该环节的数据值。例如 ("访问", 450) 表示 "访问" 环节的数据值为 450。

  • data.sort(key=lambda x: x[1], reverse=True):  对数据进行排序,按照数据值从大到小排序。漏斗图通常需要按照数据值大小排序,以保证漏斗的形状符合逻辑。

  • .add("商品转化率", data, label_opts=opts.LabelOpts(position="inside")): 添加数据系列。

    • "商品转化率":  系列名称,显示在图例和提示框中。

    • data:  数据,即我们生成的 data 列表。

    • label_opts=opts.LabelOpts(position="inside"):  设置标签配置项,position="inside" 将标签显示在漏斗图形内部。

  • .set_global_opts(title_opts=opts.TitleOpts(title="商品销售转化漏斗图")):  设置全局标题。

  • c.render_notebook(): 在 Jupyter Notebook 中渲染并显示漏斗图。

图片

案例五: 热力图 (HeatMap)

热力图通过颜色的深浅变化来可视化矩阵数据,可以直观地展示不同数据项之间的相关性、数据密度分布或数值大小的差异。热力图常用于分析用户行为热点、基因表达数据、地理数据密度等。

from pyecharts import options as opts
from pyecharts.charts import HeatMap
import random

random.seed(42)

# 生成随机热力图数据
x_axis = [f"X轴标签{i+1}"for i in range(10)] # X 轴标签
y_axis = [f"Y轴标签{i+1}"for i in range(10)] # Y 轴标签
data = []
for i in range(10): # 循环生成 10x10 的数据矩阵
    for j in range(10):
        data.append([j, i, random.randint(0, 100)]) # 添加数据点,[X轴索引, Y轴索引, 数值]

# 创建热力图对象
c = (
    HeatMap()
    .add_xaxis(x_axis) # 添加 X 轴数据,即 X 轴标签
    .add_yaxis("热力图示例", y_axis, data) # 添加 Y 轴数据和热力数据
    .set_global_opts(
        title_opts=opts.TitleOpts(title="复杂热力图示例"), # 设置全局标题
        visualmap_opts=opts.VisualMapOpts(min_=0, max_=100), # 设置视觉映射,数值范围和颜色映射
    )
)
c.render_notebook() # 在 Jupyter Notebook 中直接渲染图表
  • HeatMap(): 创建热力图对象。

  • x_axis 和 y_axis: 分别定义热力图的 X 轴和 Y 轴标签,这里生成了 10 个 X 轴标签和 10 个 Y 轴标签。

  • data:  定义热力图的数据,为一个列表,列表中的每个元素是一个包含三个值的列表 [x_index, y_index, value],分别表示 X 轴索引、Y 轴索引和该位置的数值。例如 [0, 1, 85] 表示 X 轴第一个标签、Y 轴第二个标签对应的数据值为 85。

  • .add_xaxis(x_axis):  添加 X 轴数据,即 X 轴标签列表。

  • .add_yaxis("热力图示例", y_axis, data): 添加 Y 轴数据和热力数据。

    • "热力图示例":  系列名称。

    • y_axis: Y 轴标签列表。

    • data:  热力数据,即我们生成的 data 列表。

  • .set_global_opts(visualmap_opts=opts.VisualMapOpts(min_=0, max_=100)): 设置全局配置项。

    • title_opts=opts.TitleOpts(title="复杂热力图示例"): 设置全局标题。

    • visualmap_opts=opts.VisualMapOpts(min_=0, max_=100): 设置视觉映射组件,min_ 和 max_ 定义数值范围,pyecharts 默认会根据数值范围进行颜色映射,数值越高颜色越深。

  • c.render_notebook(): 在 Jupyter Notebook 中渲染并显示热力图。

图片

通过本文的五个案例,相信大家已经了解了如何在Python中使用 pyecharts 绘制各种复杂图表。大家可尝试将这些代码复制运行,亲身体验 pyecharts 的魅力,并根据实际数据和需求,创作出更具洞察力和表现力的数据可视化作品!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值