前言
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_opts
,yaxis3d_opts
,zaxis3d_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
的魅力,并根据实际数据和需求,创作出更具洞察力和表现力的数据可视化作品!