一 折线图
1.作用
折线图可以显示随时间而变化的连续数据,因此非常适合显示相等时间间隔的数据趋势。在折线图中,类别数据沿水平轴均匀分布,值数据沿垂直轴均匀分布。
2.参数配置
3.折线图模板代码
from pyecharts.charts import Line
from pyecharts import options as opts
# 示例数据(你可以替换为自己的数据)
x_data = ["1月", "2月", "3月", "4月", "5月"]
y_data = [120, 132, 101, 134, 90]
# 创建折线图对象
line = (
Line()
.add_xaxis(x_data) # 设置横坐标
.add_yaxis("销售额", y_data, # 设置数据名称和数据
is_smooth=True, # 是否平滑曲线
symbol="circle", # 点的形状,可选:"emptyCircle", "circle", "rect", etc.
symbol_size=8, # 数据点大小
label_opts=opts.LabelOpts( # 数据标签样式
is_show=True,
position="top",
color="black",
font_size=12
))
.set_global_opts(
title_opts=opts.TitleOpts(title="月度销售额趋势图", subtitle="2025年上半年"),
toolbox_opts=opts.ToolboxOpts(), # 工具箱(保存图片、缩放等)
tooltip_opts=opts.TooltipOpts(trigger="axis"), # 鼠标悬停提示
xaxis_opts=opts.AxisOpts(name="月份"),
yaxis_opts=opts.AxisOpts(name="销售额(万元)"),
datazoom_opts=[opts.DataZoomOpts()], # 开启缩放
)
)
# 在 Jupyter Notebook 中显示
line.render_notebook()
# 或保存为 HTML 文件
# line.render("line_chart.html")
补充:多条线。
多次调用
.add_yaxis()
line.add_yaxis("2024年", y_data_2024) line.add_yaxis("2025年", y_data_2025)
from pyecharts.charts import Line from pyecharts import options as opts # 示例数据:月份(横坐标) months = ["1月", "2月", "3月", "4月", "5月"] # 各地区的平均利润率(纵坐标)——单位:百分比 beijing_rate = [12.5, 13.2, 14.0, 14.8, 15.3] shanghai_rate = [10.2, 10.8, 11.5, 12.0, 12.6] guangzhou_rate = [9.5, 10.0, 10.7, 11.4, 11.9] # 构建折线图 line = ( Line() .add_xaxis(months) .add_yaxis("北京", beijing_rate, is_smooth=True, symbol="circle", symbol_size=8) .add_yaxis("上海", shanghai_rate, is_smooth=True, symbol="rect", symbol_size=8) .add_yaxis("广州", guangzhou_rate, is_smooth=True, symbol="triangle", symbol_size=8) .set_global_opts( title_opts=opts.TitleOpts(title="各地区平均利润率趋势比较", subtitle="单位:%"), tooltip_opts=opts.TooltipOpts(trigger="axis"), toolbox_opts=opts.ToolboxOpts(), legend_opts=opts.LegendOpts(pos_top="5%", pos_left="center"), xaxis_opts=opts.AxisOpts(name="月份", axislabel_opts=opts.LabelOpts(font_size=13)), yaxis_opts=opts.AxisOpts( name="平均利润率 (%)", axislabel_opts=opts.LabelOpts(formatter="{value}%", font_size=13), name_textstyle_opts=opts.TextStyleOpts(color='red', font_size=16) ) ) ) # 在 Jupyter Notebook 中渲染图表 # line.render_notebook() # 或保存为 HTML 文件查看 line.render("multi_line_chart.html")
4.案例:各门店销售业绩比较分析
某企业2022年各门店销售业绩,绘制各门店的销售额的折线图。
#声明Notebook类型,必须在引入pyecharts.charts等模块前声明
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pymysql
from pyecharts import options as opts
from pyecharts.charts import Line, Page
#连接MySQL数据库
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',
db='sales',charset='utf8')
cursor = conn.cursor()
#读取MySQL表数据
sql_num = "SELECT store_name,ROUND(SUM(sales/10000),2) FROM orders WHERE
dt=2022 GROUP BY store_name"
cursor.execute(sql_num)
sh = cursor.fetchall()
v1 = []
v2 = []
for s in sh:
v1.append(s[0])
v2.append(s[1])
#绘制折线图
def line_toolbox() -> Line:
c = (
Line()
.add_xaxis(v1)
.add_yaxis("销售额", v2, is_smooth=True,is_selected=True)
#is_smooth默认是False,即折线;is_selected默认是False,即不选中
.set_global_opts(
title_opts=opts.TitleOpts(title="2022年各门店销售业绩比较分析"),
toolbox_opts=opts.ToolboxOpts(),
legend_opts=opts.LegendOpts(is_show=True,pos_left ='center',
pos_top ='top',item_width = 25,item_height = 25),
xaxis_opts=opts.AxisOpts(name='门店',name_textstyle_opts=
opts.TextStyleOpts(color='red',font_size=20),
axislabel_opts=opts.LabelOpts(font_size=15)),
yaxis_opts=opts.AxisOpts(name='销售额',name_textstyle_opts=
opts.TextStyleOpts(color='red',font_size=20),
axislabel_opts=opts.LabelOpts(font_size=15),
name_location = "middle")
)
.set_series_opts(label_opts=opts.LabelOpts(position='top',
color='black',font_size=15))
)
return c
#第一次渲染时调用load_javasrcript文件
line_toolbox().load_javascript()
#展示数据可视化图表
line_toolbox().render_notebook()
建立与本地 MySQL 数据库 sales
的连接,并获取操作数据库的 cursor
对象,后续用于执行 SQL 查询。
执行 SQL 查询:
第1行:MySQL 查询语句,从数据库中获取每家门店在 2022 年的总销售额。
第2行:执行SQL语句,使用 cursor
对象执行刚才定义的 SQL 语句。cursor
是用 conn.cursor()
创建的,是操作数据库的“指针”。
第3行:获取所有查询结果。fetchall()
:一次性从查询结果中取出所有行,返回一个元组列表。每一行数据的格式是一个元组 (store_name, sales_sum)
。
例如:
将 SQL 查询结果拆分成两个列表 v1
(X轴门店名)、v2
(Y轴销售额),方便传给图表。
v1
:用于存放门店名(作为 X 轴)
v2
:用于存放对应门店的销售额(作为 Y 轴)
例如:
第1行:函数定义与返回类型注解。
def line_toolbox()
:定义一个函数,名字叫 line_toolbox
,调用它时会返回一个图表对象。
-> Line
是函数的返回类型注解,意思是:“这个函数返回一个 Line
类型的对象”
这种语法是类型注解,告诉使用者/编辑器你返回了什么类型。非强制性,Python 不会因类型不匹配而报错,只是给人看的提示。
第2,3行:
Line()
是从 pyecharts.charts
中导入的折线图类,实例化一个空的图表对象。
外层括号用于支持多行链式调用(更清晰可读),不是必须的,但推荐用于较长语句。
补充:.method()
是链式调用风格。Line().add_xaxis(...).add_yaxis(...).set_global_opts(...)
一行接一行设置图表的各个方面,就像搭积木一样构造出最终图表对象。
第4行:添加 X 轴数据。参数 v1
是一个列表,表示 X 轴的刻度标签
第5行:添加 Y 轴数据并设置样式。
.add_yaxis(...)
:添加一组 Y 轴数据。"销售额"
:是这一组数据的系列名称,会显示在图例上。v2
:一个与 v1
对应的数值列表,比如 [100.2, 150.6, 90.1]
。is_smooth=True
:曲线平滑(如果是 False 就是折线)。is_selected=True
:图例中默认勾选显示该数据系列。
第1行:
set_global_opts(...): 用于设置整个图表的全局配置项(如标题、工具栏、图例、坐标轴等)。
第2行:title_opts=opts.TitleOpts(...)
:设置图表标题。
第3行:toolbox_opts=opts.ToolboxOpts()
:启用右上角工具栏。会显示一个悬浮工具栏,用户可以:保存为图片,查看原始数据,恢复视图等。
legend_opts:图例样式。控制图例是否显示、摆放位置(顶部中央)、图标大小。
xaxis_opts:X 轴样式。name='门店'
:给 X 轴命名。name_textstyle_opts
:控制轴名的字体样式(颜色/大小)。axislabel_opts
:控制刻度标签样式(如横坐标上的“北京店”等)。
yaxis_opts:Y 轴样式。用于设置 Y 轴标题、样式,类比x轴。name_location="middle"
:让轴标题居中显示在轴线旁边。
设置具体数据系列的样式(比如数据标签、点样式等)。
label_opts
控制每个数据点上是否显示标签。position='top'
:显示在点上方。color='black'
:标签颜色。font_size=15
:标签字体大小。
不希望显示标签,也可以设置 label_opts=opts.LabelOpts(is_show=False)
。
函数返回创建好的图表对象 c
(即 Line
实例),可用于后续渲染或展示。
加载 pyecharts
渲染所需的 JavaScript 资源(特别是在某些离线环境下)。
在 JupyterLab 中内嵌显示图表。
二 条形图
1.作用
条形图是一种把连续数据画成数据条的表现形式,通过比较不同组的条形长度,从而对比不同组的数据量大小。
描绘条形图的要素有3个:组数、组宽度、组限。
2.参数配置
1.add_yaxis函数的配置样例
def add_yaxis(
series_name: str,
yaxis_data: Sequence[Numeric, opts.BarItem, dict],
is_selected: bool = True,
xaxis_index: Optional[Numeric] = None,
yaxis_index: Optional[Numeric] = None,
color: Optional[str] = None,
stack: Optional[str] = None,
category_gap: Union[Numeric, str] = "20%",
gap: Optional[str] = None,
label_opts: Union[opts.LabelOpts, dict] = opts.LabelOpts(),
markpoint_opts: Union[opts.MarkPointOpts, dict, None] = None,
markline_opts: Union[opts.MarkLineOpts, dict, None] = None,
tooltip_opts: Union[opts.TooltipOpts, dict, None] = None,
itemstyle_opts: Union[opts.ItemStyleOpts, dict, None] = None,
)
2.BarItem类样例
条形图的数据项在BarItem类中进行设置。
BarItem类参数:
class BarItem(
name: Optional[str] = None,
value: Optional[Numeric] = None,
label_opts: Union[LabelOpts, dict, None] = None,
itemstyle_opts: Union[ItemStyleOpts, dict, None] = None,
tooltip_opts: Union[TooltipOpts, dict, None] = None,
)
3.条形图参数配置
绘制条形图时,只需要按照模板进行调用即可。
第1行:定义一个函数 bar_base
。-> Bar
表示这个函数返回一个条形图(Bar 类型)对象。以后只要调用 bar_base()
,就能直接得到一张图。
第2,3行:创建一个 Bar()
条形图对象,用变量 c
接收它。后续用链式调用给这个图“配置内容”。
第4行:设置 X 轴的内容(横坐标)。Faker.choose()
是 pyecharts 自带的假数据模块,会生成类似 [“衬衫”, “毛衣”, “外套”]
这样的类别列表。相当于你在横轴上标了几个商品/门店名。
第5行:向图中添加一组数据(即一根根柱子)。"门店A"
是这组数据的名字(图例名称)。Faker.values()
是每个横坐标点对应的“销售额”等数据,比如 [120, 200, 150]
。
第6行:再加一组数据 "门店B"
,会和门店A并排显示。一张图上有多个系列(series)就可以做比较。
补充:如何隐藏某条系列(比如不想默认显示“门店B”)。
.add_yaxis("门店B", Faker.values(), is_selected=False)
加上
is_selected=False
就行了。意思是:“这组数据(门店B)虽然加进去了,但初始时不勾选显示”。你可以在图表上手动点击图例把它打开。
第7行:设置“全局选项”。图表的主标题是“销售额统计”,副标题是“2018年”。
第8行:返回这张图表对象,外面调用这个函数就能直接使用。
加工具栏(保存图片、查看数据等)和图例。 默认 legend 是显示的,你也可以写 is_show=False
来隐藏图例。
3.条形图模板代码
from pyecharts.charts import Bar
from pyecharts import options as opts
# 示例数据
x_data = ["A", "B", "C", "D", "E"]
y_data = [10, 20, 30, 40, 50]
# 创建条形图对象
bar = (
Bar()
.add_xaxis(x_data) # 添加横坐标(分类)
.add_yaxis("示例系列", y_data) # 添加纵坐标数据和系列名称
.set_global_opts(
title_opts=opts.TitleOpts(title="基础条形图", subtitle="pyecharts 示例"),
xaxis_opts=opts.AxisOpts(name="类别"),
yaxis_opts=opts.AxisOpts(name="数值"),
toolbox_opts=opts.ToolboxOpts(), # 显示工具箱
datazoom_opts=opts.DataZoomOpts(), # 添加缩放组件
)
)
# 渲染为 HTML 文件
bar.render("bar_chart.html")
补充:多次调用 add_yaxis()
from pyecharts.charts import Bar from pyecharts import options as opts # 示例数据 x_data = ["一月", "二月", "三月", "四月", "五月"] series1 = [20, 34, 45, 31, 50] series2 = [15, 28, 35, 40, 42] series3 = [10, 22, 30, 28, 36] # 创建图表对象 bar = ( Bar() .add_xaxis(x_data) # 添加横坐标 .add_yaxis("产品A", series1) .add_yaxis("产品B", series2) .add_yaxis("产品C", series3) .set_global_opts( title_opts=opts.TitleOpts(title="多系列条形图示例"), toolbox_opts=opts.ToolboxOpts(), # 工具箱功能 legend_opts=opts.LegendOpts(pos_top="5%"), # 图例位置 xaxis_opts=opts.AxisOpts(name="月份"), yaxis_opts=opts.AxisOpts(name="销售量"), datazoom_opts=[opts.DataZoomOpts()], # 缩放功能 ) ) # 渲染为 HTML 文件 bar.render("multi_series_bar.html")
补充:堆叠条形图。
from pyecharts.charts import Bar from pyecharts import options as opts # 示例数据 x_data = ["一月", "二月", "三月", "四月", "五月"] series1 = [20, 34, 45, 31, 50] series2 = [15, 28, 35, 40, 42] series3 = [10, 22, 30, 28, 36] # 创建堆叠条形图 bar = ( Bar() .add_xaxis(x_data) # 添加横坐标 .add_yaxis("产品A", series1, stack="总量") .add_yaxis("产品B", series2, stack="总量") .add_yaxis("产品C", series3, stack="总量") .set_global_opts( title_opts=opts.TitleOpts(title="堆叠条形图示例"), toolbox_opts=opts.ToolboxOpts(), # 工具箱 legend_opts=opts.LegendOpts(pos_top="5%"), # 图例位置 xaxis_opts=opts.AxisOpts(name="月份"), yaxis_opts=opts.AxisOpts(name="总销售量"), ) ) # 渲染为 HTML 文件 bar.render("stacked_bar_chart.html")
4.案例:各省市商品订单数量分析
分析2022年某企业在各省市的商品订单数量,可以绘制各个省市商品订单数量的条形图。
#声明Notebook类型,必须在引入pyecharts.charts等模块前声明
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pymysql
from pyecharts import options as opts
from pyecharts.charts import Bar, Page
#连接MySQL数据库
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',
db='sales',charset='utf8')
cur = conn.cursor()
#读取MySQL表数据
sql_num = "select province,count(cust_id) from orders WHERE
dt=2022 group by province"
cur.execute(sql_num)
sh = cur.fetchall()
v1 = []
v2 = []
for s in sh:
v2.append(s[1])
v1.append(s[0])
#条形图参数配置
def bar_base() -> Bar:
c = (
Bar()
.add_xaxis(v1,)
.add_yaxis("客户订单量", v2)
.set_global_opts(
title_opts=opts.TitleOpts(title="2022年各省份订单量分布"),
toolbox_opts=opts.ToolboxOpts(),
legend_opts=opts.LegendOpts(is_show=True,pos_left ='center',
pos_top ='top',item_width = 25,item_height = 25),
xaxis_opts=opts.AxisOpts(name='省份',name_textstyle_opts=
opts.TextStyleOpts(color='red',font_size=20),
axislabel_opts=opts.LabelOpts(font_size=6)),
yaxis_opts=opts.AxisOpts(name='订单量',name_textstyle_opts=
opts.TextStyleOpts(color='red',font_size=20),
axislabel_opts=opts.LabelOpts(font_size=15),
name_location = "middle")
)
.set_series_opts(label_opts=opts.LabelOpts(position='top',
color='black',font_size=15))
)
return c
#第一次渲染时调用load_javasrcript文件
bar_base().load_javascript()
#展示数据可视化图表
bar_base().render_notebook()
如折线图。
第1行:定义一个返回 Bar
图表的函数 bar_base
。
第3行:实例化一个柱状图对象。
第1行:设置横轴刻度标签,即各省份名称。
第2行: 添加一组柱形数据:名称为“客户订单量”;数据来源于订单数列表 v2
。
第1行: 设置图表的全局参数(标题、坐标轴、工具栏、图例等)。
第2行:设置图表标题。
第3行:显示右上角工具按钮:保存为图片、数据视图等。
第4行:图例配置。显示图例;图例放在图表顶部中央;图例图标尺寸设置为 25x25。
第6行:X 轴配置。设置 X 轴名称为“省份”;名称样式:红色、字体 20;坐标标签字体较小(6),避免省名太多挤不下。
第9行:Y 轴名称:“订单量”;红色字体、字号 20;标签字号 15;name_location="middle"
表示居中显示轴名称。
显示每根柱子顶上的数值标签;标签颜色黑色;字体大小为 15。
三 箱形图
1.作用
用于展示一组数据的分布特征,包括中位数、四分位数、异常值等。
2.结构
3.参数配置
箱形图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。
4.箱型图模板代码
from pyecharts.charts import Boxplot
from pyecharts import options as opts
import random
# 示例原始数据(5组)
data = [[random.randint(30, 80) for _ in range(20)] for _ in range(5)]
# 使用 Boxplot 工具类进行统计转换(计算中位数、上下四分位、异常值等)
from pyecharts.commons.utils import JsCode
from pyecharts.faker import Faker
from pyecharts.charts import Boxplot
box = Boxplot()
box_data = box.prepare_data(data)
# 绘制箱型图
chart = (
Boxplot()
.add_xaxis(["样本A", "样本B", "样本C", "样本D", "样本E"])
.add_yaxis("实验组", box_data)
.set_global_opts(
title_opts=opts.TitleOpts(title="箱型图示例"),
toolbox_opts=opts.ToolboxOpts(), # 工具箱
xaxis_opts=opts.AxisOpts(name="组别"),
yaxis_opts=opts.AxisOpts(name="数值"),
)
)
# 渲染为 HTML 文件
chart.render("boxplot_chart.html")
data:
补充:多次调用add_yaxis()
from pyecharts.charts import Boxplot from pyecharts import options as opts import random # 构造原始数据:每组包含20个数值,共5组 data_exp = [[random.randint(30, 80) for _ in range(20)] for _ in range(5)] data_ctrl = [[random.randint(25, 75) for _ in range(20)] for _ in range(5)] # 创建 Boxplot 实例对象 boxplot = Boxplot() # 处理数据为箱型图格式 exp_data = boxplot.prepare_data(data_exp) ctrl_data = boxplot.prepare_data(data_ctrl) # 创建图表 chart = ( Boxplot() .add_xaxis(["样本A", "样本B", "样本C", "样本D", "样本E"]) .add_yaxis("实验组", exp_data) .add_yaxis("对照组", ctrl_data) .set_global_opts( title_opts=opts.TitleOpts(title="实验组 vs 对照组 - 箱型图对比"), legend_opts=opts.LegendOpts(pos_top="5%"), toolbox_opts=opts.ToolboxOpts(), # 工具箱 xaxis_opts=opts.AxisOpts(name="样本组别"), yaxis_opts=opts.AxisOpts(name="观测值"), ) ) # 渲染为 HTML 文件 chart.render("boxplot_compare.html")
5.案例:不同类型商品的收益分析
分析2022年某企业不同类型商品的收益情况,可以绘制不同商品的箱形图。
#声明Notebook类型,必须在引入pyecharts.charts等模块前声明
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pymysql
from pyecharts import options as opts
from pyecharts.charts import Boxplot, Page
#连接MySQL数据库
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',
db='sales',charset='utf8')
cur = conn.cursor()
#读取MySQL表数据
sql_num = "SELECT subcategory,ROUND(avg(rate)*100,2) FROM orders WHERE
dt=2022 GROUP BY subcategory"
cur.execute(sql_num)
sh = cur.fetchall()
v1 = []
v2 = []
for s in sh:
v1.append(s[0])
v2.append(s[1])
def boxpolt_base() -> Boxplot:
c = Boxplot()
c.add_xaxis(["利润率"])
c.add_yaxis("利润率", c.prepare_data([v2]))
c.set_global_opts(
title_opts=opts.TitleOpts(title="不同类型商品利润率分析"),
toolbox_opts=opts.ToolboxOpts(),
legend_opts=opts.LegendOpts(is_show=True,pos_left ='center',
pos_top ='top',item_width = 25,item_height = 25),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=15)),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=15))
)
c.set_series_opts(label_opts=opts.LabelOpts(position='top',color='black',
font_size=15))
return c
#第一次渲染时候调用load_javasrcript文件
boxpolt_base().load_javascript()
#展示数据可视化图表
boxpolt_base().render_notebook()
第1行:定义一个函数,返回一个 Boxplot
类型的图表。
第2行:新建箱形图对象。
第3行:X轴只设置一个类别名“利润率”。
第4行:.prepare_data()
会计算出该组数据的最小值、四分位数、中位数、最大值和异常值,作为箱形图输入
第5行:设置全局图表样式。
第6行:设置图表标题。
第7行:添加右上角工具栏(保存图片、查看数据等)。
第8,9行:显示图例,居中显示在顶部,设置图例项尺寸。
xaxis_opts 和 yaxis_opts:设置 X 和 Y 轴的坐标文字大小为 15。
c.set_series_opts:label_opts
设置每组箱线标签样式:位置:顶部;颜色:黑色;字号:15。
四 涟漪散点图
1.作用
涟漪散点图是一类特殊的散点图,只是散点图中带有涟漪特效,利用特效可以突出显示某些想要的数据。
2.参数配置
涟漪散点图:
涟漪特效散点图:
3.涟漪散点图模板代码
from pyecharts.charts import EffectScatter
from pyecharts import options as opts
# 示例数据
x_data = ["A", "B", "C", "D", "E"]
y_data = [10, 20, 36, 18, 25]
# 创建涟漪散点图
chart = (
EffectScatter()
.add_xaxis(x_data)
.add_yaxis(
series_name="示例数据",
y_axis=y_data,
symbol="circle",
symbol_size=15,
effect_opts=opts.EffectOpts(
scale=6, # 涟漪最大扩展半径
period=4 # 扩散周期(越小越快)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="涟漪散点图示例"),
xaxis_opts=opts.AxisOpts(name="分类"),
yaxis_opts=opts.AxisOpts(name="值"),
toolbox_opts=opts.ToolboxOpts(), # 显示工具箱
)
)
# 渲染为 HTML 文件
chart.render("fixed_effect_scatter.html")
4.案例:不同收入等级客户价值分析
为了分析2022年某企业不同收入等级客户的价值,可以绘制不同等级客户的涟漪散点图。
定义一个函数 effectscatter_splitline
。-> EffectScatter
是 类型注解,表示这个函数返回的是一个 EffectScatter
(动态散点图)对象。
创建一个动效散点图对象 c
。EffectScatter()
会自动包含“动效点”的支持,如涟漪、跳动等。
第1行:添加横坐标数据(X轴),使用列表 v1
。v1
可能表示不同的客户等级、用户群体、产品编号等。
第2行: 添加纵坐标数据(Y轴),用 v2
(例如客户价值)。""
:图例名称为空,不显示图例名称。symbol=SymbolType.ARROW
:设置点的形状为“箭头”图标。
第1行:设置图表全局参数。
title_opts:设置主标题和副标题。
toolbox_opts:显示右上角工具栏。
legend_opts:显示图例。
xaxis_opts 和 yaxis_opts:splitline_opts=opts.SplitLineOpts(is_show=True)为 X、Y 轴添加背景分隔线(横线、竖线)。
五 K线图
1.作用
K线图是一种能让你一眼看出股票涨跌趋势的图表,每一根K线包含4个价格数据。
多根K线组合,就能反映某段时间内的价格波动情况。
K线图,也叫蜡烛图,是炒股、看期货时最常见的一种图表。
用一根根“蜡烛”形状的小柱子,来表示每天(或每周、每月)股票价格的变化情况。
每一根K线,都会显示这一天的4个关键数据:
如果某只股票:开盘是 10 元收盘是 12 元最高到了 13 元最低到了 9 元这一根K线就表示当天是上涨的(收盘 > 开盘),会画成一个红色的“蜡烛”。
多根K线 = 一张趋势图。
from pyecharts.charts import Kline
from pyecharts import options as opts
# 模拟5天的股票数据:[开盘价, 收盘价, 最低价, 最高价]
data = [
[100, 105, 95, 110],
[106, 103, 101, 108],
[104, 110, 100, 112],
[109, 108, 105, 113],
[107, 102, 101, 109]
]
# 每天的日期标签
dates = ["5月20日", "5月21日", "5月22日", "5月23日", "5月24日"]
# 创建K线图
kline = (
Kline()
.add_xaxis(dates)
.add_yaxis("股票价格", data)
.set_global_opts(
title_opts=opts.TitleOpts(title="模拟股票K线图"),
xaxis_opts=opts.AxisOpts(type_="category"),
yaxis_opts=opts.AxisOpts(
is_scale=True, # 不强制从0开始
splitarea_opts=opts.SplitAreaOpts(is_show=True)
),
datazoom_opts=[opts.DataZoomOpts()], # 可缩放拖动查看
tooltip_opts=opts.TooltipOpts(trigger="axis")
)
)
kline.render("fixed_2.0.8.html")
2.参数配置
3.K线图模板代码
from pyecharts.charts import Kline
from pyecharts import options as opts
# 示例日期(x轴)
x_data = ["2025-05-20", "2025-05-21", "2025-05-22", "2025-05-23", "2025-05-24"]
# 每组包含 [开盘价, 收盘价, 最低价, 最高价]
y_data = [
[2320.26, 2302.6, 2287.3, 2362.94],
[2300, 2291.3, 2288.26, 2308.38],
[2295.35, 2346.5, 2295.35, 2346.92],
[2347.22, 2358.98, 2337.35, 2363.8],
[2360.75, 2382.48, 2347.89, 2383.76],
]
# 创建K线图
kline = (
Kline()
.add_xaxis(x_data)
.add_yaxis("股票价格", y_data)
.set_global_opts(
title_opts=opts.TitleOpts(title="K线图示例"),
xaxis_opts=opts.AxisOpts(type_="category", name="日期"),
yaxis_opts=opts.AxisOpts(name="价格"),
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], # 支持缩放
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), # 悬浮提示
)
)
# 渲染为 HTML 文件
kline.render("kline_chart.html")
4.案例:企业股票价格趋势分析
为了分析某企业在2023年股票价格的趋势,可以绘制股票价格的K线图。
从数据库中提取2023年的股票数据;
将日期和价格整理为 Kline
图表所需格式,分别保存在 v1
(x轴时间)和 v2
(y轴蜡烛数据)中。
# 连接MySQL数据库
conn = pymysql.connect(
host='127.0.0.1', # 本地数据库地址
port=3306, # MySQL默认端口
user='root', # 用户名
password='root', # 密码
db='sales', # 使用的数据库名称为 sales
charset='utf8' # 编码格式为 utf8,防止中文乱码
)
cursor = conn.cursor() # 创建数据库操作游标,用于执行 SQL 语句
查询 stocks
表中 2023年
的股票数据;
按 date
升序排序;
查询的字段有:date
(日期)open
(开盘价)high
(最高价)low
(最低价)close
(收盘价)
第1行:用 cursor(数据库游标)来执行上面的 SQL 查询。
第2行:将查询到的所有结果一次性取出,并存入变量 sh
中。sh
是一个列表,包含多个元组,每个元组对应一条数据库记录。
分别初始化了两个空列表。
第1行:用于保存日期(x轴)。
第2行:用来存储 K 线图需要的 [open, close, low, high]
数据。
遍历 sh
中的每条记录(即每个元组),将第 0 个字段 date
提取出来,并用 []
包一层(变成列表),再加入到 v1
中。把每一个元组的第一个元素(日期)提取出来,加入到 v1 列表中。
注意:[s[0]]
是包装成列表,例如:['2023-01-01']
。如果 s[0] = '2023-01-01'
,则追加的是 ['2023-01-01']
。
再次遍历 sh
中的每条记录,将 open
, high
, low
, close
四个值按顺序放入一个列表,并追加到 v2
中。注意顺序是 [open, high, low, close]。
将 v2
赋值给 data
,为后续图表绘制做准备。
该函数 kline_markline()
会返回一个配置好的蜡烛图(K线图),功能包括:
展示股票在2023年的价格变化;
自动标注最高收盘价;
支持缩放、图例、工具箱等功能;
美化了坐标轴和数据标签的样式。
定义了一个函数 kline_markline()
,返回值类型是 Kline
(来自 pyecharts.charts
,用于绘制K线图)。
创建一个 Kline 图实例,赋值给变量 c
。
添加横坐标(时间/日期),v1
是前面从数据库中提取并整理的日期列表。
第2,3行:添加纵坐标数据,名称为“股票价格”,数据为之前整理的 K 线数据 data
。
第4,5行:使用 MarkLine
添加一条“最大收盘价”的标记线。
type_="max"
表示取最大值;
value_dim="close"
表示基于“收盘价”来确定最大值。
第1行: 设置图表全局选项。
第2行:设置 X 轴样式。is_scale=True
: 不强制从0开始;name="日期"
: 设置轴名;轴名颜色为红色、字号为20;坐标标签字体大小为15。
第5行:设置 Y 轴样式。与 X 轴类似,设置 Y 轴名为“价格”,样式为红色+字号20;is_scale=True
:不固定最小值为0。
第8,9行:设置背景区域交错色。splitarea_opts
: 显示分隔区域背景色;opacity=1
: 不透明。
第10行:设置坐标轴名称居中,坐标轴名称显示在中间。
第11行:设置数据区域边距(上下留白),开启缩放组件,位置在图表底部2%处。
第12行:设置图表主标题。
默认启用工具箱(包括保存为图片等功能)。
显示图例;居中上方对齐;图例图标尺寸:宽25,高25。
设置每个蜡烛图的数据标签样式:在每个数据点顶部显示标签,黑色字体,字号15。
返回构建好的 Kline
图表对象。
第1行:
load_javascript()
是 pyecharts 的一个方法;
它用于在 Jupyter Notebook 环境 中首次显示图表时,加载必要的 JavaScript 库(如 echarts.js);
如果已经加载过一次,这一步可省略;
这通常只在第一次绘图或 Notebook 重启后执行一次。
第2行:
render_notebook()
是用来在 Jupyter Notebook 中嵌入并显示图表的方法;
它会直接在输出单元格中渲染 HTML + JS 图表内容;
此语句最终展示的是由 kline_markline()
函数生成的 K 线图。
六 双坐标轴图
1.作用
双坐标轴图是一种组合图表,一般将两种不同类型的图表组合在同一个“画布”上,如柱状图和折线图的组合。
2.双坐标轴图模板代码
from pyecharts.charts import Bar, Line
from pyecharts import options as opts
# 横轴数据
x_data = ["一月", "二月", "三月", "四月", "五月"]
# 柱状图数据(例如:销售额)
bar_data = [120, 200, 150, 80, 70]
# 折线图数据(例如:利润率 %)
line_data = [5.2, 7.1, 6.4, 3.8, 2.9]
# 创建图表
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("销售额(万元)", bar_data, yaxis_index=0)
.extend_axis(
yaxis=opts.AxisOpts(
name="利润率(%)",
type_="value",
position="right",
axislabel_opts=opts.LabelOpts(formatter="{value}%"),
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="双坐标轴图示例"),
yaxis_opts=opts.AxisOpts(
name="销售额(万元)",
position="left",
axislabel_opts=opts.LabelOpts(formatter="{value}"),
),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
legend_opts=opts.LegendOpts(pos_top="5%"),
)
)
# 添加折线图作为叠加图层,使用 yaxis_index=1 表示右侧 Y 轴
line = (
Line()
.add_xaxis(x_data)
.add_yaxis("利润率(%)", line_data, yaxis_index=1)
)
# 合并图表
bar.overlap(line).render("dual_axis_chart.html")
3.案例:区域销售业绩及数量分析
从数据库中按地区提取 2022 年的订单汇总数据;
分别得到各地区的利润(单位万元)和平均比率(百分比);
并将其拆分为三个列表 v1
、v2
、v3
,为后续图表(如柱状图、折线图、饼图等)准备数据源。
第1,2行: 构造了 SQL 查询语句。返回的表中有三个字段。
从 orders
表中查询数据;
region
: 地区字段;
ROUND(SUM(profit)/10000,2)
:对利润总和除以 10,000 后保留两位小数,表示单位为“万元”;
ROUND(avg(rate)*100,2)
:对比率字段 rate
的平均值乘以 100 后保留两位小数,表示为百分比形式;
只筛选 dt = 2022
的记录;
并按 region
进行分组(GROUP BY)。
第3行:将所有查询结果一次性取出,返回一个列表,每个元素是一个元组(一行结果)。
第4,5,6行:定义三个空列表。v1
用于存储地区;v2
用于存储汇总后的利润(万元);v3
用于存储平均比率(%)。
逐行遍历查询结果 sh
,将每一列的数据分别追加到对应列表中:s[0]
是 region
;s[1]
是 ROUND(SUM(profit)/10000,2)
的值;s[2]
是 ROUND(avg(rate)*100,2)
的值。
函数 overlap_bar_line()
的作用是:
绘制一个以“地区”为横轴、以“利润额”为柱状图主轴、以“平均利润率”为折线图副轴的组合图;
支持数据标签、格式化显示、颜色与字体样式控制;
图表适用于展示多变量的对比关系,如“销售额 + 增长率”、“产量 + 效率”等组合分析。
定义一个函数 overlap_bar_line
,返回一个 Bar
(柱状图)对象(其实最终是柱状图 + 折线图组合)。
创建柱状图对象,创建一个 Bar
柱状图实例。
第1行:设置 X 轴(地区), 添加横坐标数据,v1
是各地区名称列表。
第2行:添加 Y 轴 1(利润总额,单位万元),添加第一个 Y 轴系列,名称为“利润额”,数据为 v2
(每个地区的利润)。
添加扩展轴(用于后续叠加折线图使用)。extend_axis
是为了后续叠加“平均利润率”的折线图,设置额外的 y 轴;轴名为“平均利润率”,红色、20号字;格式化标签;间距设置为 0.5;轴名居中。
隐藏柱状图的数据标签。
第1行:设置图表整体配置。
第2行:设置图表标题。
第3行:工具箱.
对图表的 X 轴和 Y 轴的显示样式进行详细配置:
设置 X 轴标签字体为15号。
xaxis_opts
:设置横坐标轴(X 轴)的选项;
axislabel_opts
:设置 X 轴上刻度标签(也就是显示的文字,比如“北京”“上海”)的样式;
font_size=15
:字体大小为 15。
纵轴(Y 轴)标签是数字格式,字体为15;
Y 轴每隔 1 单位显示一个刻度;
Y 轴的名字是“利润额”,居中显示,红色,字号20。
再次设置数据标签样式(这次为折线图服务),将数据标签放置在柱子/点的顶部。
创建折线图对象并设置样式:使用 Line()
创建折线图;横坐标是地区列表 v1
;Y 轴数据是 v3
(平均利润率);yaxis_index=1
指的是用前面扩展的第二个 y 轴;设置数据点大小为 20;标签显示在上方。
叠加折线图到柱状图上。