13.Pyecharts:基础绘图

一 折线图

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(动态散点图)对象。

创建一个动效散点图对象 cEffectScatter() 会自动包含“动效点”的支持,如涟漪、跳动等。

第1行:添加横坐标数据(X轴),使用列表 v1v1 可能表示不同的客户等级、用户群体、产品编号等。

第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 年的订单汇总数据;

分别得到各地区的利润(单位万元)和平均比率(百分比);

并将其拆分为三个列表 v1v2v3,为后续图表(如柱状图、折线图、饼图等)准备数据源。

第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]regions[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;标签显示在上方。

叠加折线图到柱状图上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值