当前位置: 代码网 > it编程>前端脚本>Python > 一文教你使用Python绘制丝滑的K线图

一文教你使用Python绘制丝滑的K线图

2025年04月21日 Python 我要评论
前段时间写了一篇用 pyecharts 绘制 k 线图的文章,结果朋友们一个个跑来留言——“花姐,这个图咋不全屏?”“成交量缩放有问题,咋整

前段时间写了一篇用 pyecharts 绘制 k 线图的文章,结果朋友们一个个跑来留言——

“花姐,这个图咋不全屏?”

“成交量缩放有问题,咋整?”

“有没有更方便的封装方式?我想一行代码就搞定!”

好嘛,大家的愿望就是我改进的动力!这不,花姐连夜优化了一版,并且封装成一个类,只要传入符合格式的 dataframe 数据,一行代码搞定丝滑的 k 线图,完美支持全屏+缩放!

准备好?先看看效果,然后咱们开整!

优化后的 k 线图,支持:

全屏展示(再也不用担心小图看不清)

成交量缩放(精准掌握市场动向)

更丝滑的交互体验

这是stockklinechart.py文件内容,绘制k线图的类,拿来就能用

import pandas as pd
from pyecharts.charts import kline, line, bar, grid
from pyecharts import options as opts
from pyecharts.commons.utils import jscode

class stockklinechart:
    def __init__(self, df: pd.dataframe, stock_code: str):
        """
        初始化 k 线图表对象

        :param df: 股票数据 dataframe(包含“日期”,“开盘”,“收盘”,“最低”,“最高”,“成交量”)
        :param stock_code: 股票代码
        """
        self.df = df.sort_values("日期")  # 按日期排序,确保数据按时间顺序排列
        self.stock_code = stock_code  # 股票代码
        self.color_up = "#ef232a"  # 阳线(上涨)颜色
        self.color_down = "#14b143"  # 阴线(下跌)颜色
        self.ma_periods = [5, 10, 20]  # 移动平均线周期
        self.ma_colors = {5: "#ff0000", 10: "#0000ff", 20: "#00ff00"}  # 均线颜色

    def _prepare_data(self):
        """ 处理数据:提取 k 线数据、计算移动均线、设置成交量颜色 """
        self.dates = self.df['日期'].tolist()  # 提取日期列表
        self.kline_data = self.df[["开盘", "收盘", "最低", "最高"]].values.tolist()  # 提取 k 线数据

        # 计算移动平均线
        for period in self.ma_periods:
            self.df[f'ma{period}'] = (
                self.df['收盘']
                .rolling(window=period)
                .mean()
                .bfill()  # 处理 nan 值(前向填充)
                .round(2)  # 保留两位小数
            )

        # 计算成交量颜色标记(1: 上涨, -1: 下跌)
        self.df['color'] = self.df.apply(
            lambda x: 1 if x['收盘'] >= x['开盘'] else -1,
            axis=1
        )
        self.df['index_vol'] = range(len(self.df))  # 给成交量数据添加索引

    def create_chart(self):
        """ 生成 k 线图表 """
        self._prepare_data()  # 处理数据

        # ================== k 线图配置 ==================
        kline = (
            kline()
            .add_xaxis(self.dates)  # 设置 x 轴日期
            .add_yaxis(
                series_name="k线",  # k 线名称
                y_axis=self.kline_data,  # k 线数据(开盘、收盘、最低、最高)
                itemstyle_opts=opts.itemstyleopts(
                    color=self.color_up,  # 阳线颜色
                    color0=self.color_down  # 阴线颜色
                )
            )
            .set_global_opts(
                title_opts=opts.titleopts(
                    title="股票k线走势图",  # 图表标题
                    subtitle=f"股票代码:{self.stock_code}",  # 副标题
                    pos_left="left"  # 标题位置
                ),
                legend_opts=opts.legendopts(
                    is_show=true,  # 是否显示图例
                    pos_top=10,  # 图例位置(顶部)
                    pos_left="center"  # 居中对齐
                ),
                xaxis_opts=opts.axisopts(
                    type_="category",  # x 轴类型(类别)
                    axislabel_opts=opts.labelopts(rotate=0),  # x 轴标签角度
                    splitline_opts=opts.splitlineopts(is_show=true)  # 是否显示网格线
                ),
                yaxis_opts=opts.axisopts(
                    is_scale=true,  # y 轴是否自适应缩放
                    splitarea_opts=opts.splitareaopts(
                        is_show=true,  # 是否显示网格背景
                        areastyle_opts=opts.areastyleopts(opacity=1)  # 设置透明度
                    )
                ),
                tooltip_opts=opts.tooltipopts(
                    trigger="axis",  # 触发方式:鼠标悬浮时显示
                    axis_pointer_type="cross",  # 坐标轴指示器类型(十字指示)
                ),
                datazoom_opts=[
                    opts.datazoomopts(
                        is_show=false,  # 是否显示数据缩放控件
                        type_="inside",  # 缩放类型:内部滑动
                        xaxis_index=[0, 1],  # 作用于 x 轴
                        range_start=80,  # 初始显示范围
                        range_end=100
                    ),
                    opts.datazoomopts(
                        is_show=true,  # 显示滑动条缩放
                        xaxis_index=[0, 1],
                        type_="slider",
                        pos_top="100%",  # 位置:底部
                        range_start=80,
                        range_end=100
                    )
                ],
                # 坐标轴指示器
                axispointer_opts=opts.axispointeropts(
                    is_show=true,
                    link=[{"xaxisindex": "all"}],
                    label=opts.labelopts(background_color="#777")
                )
            )
        )

        # ================== 移动平均线配置 ==================
        line = line().add_xaxis(self.dates)
        for period in self.ma_periods:
            line.add_yaxis(
                series_name=f"ma{period}",
                y_axis=self.df[f'ma{period}'].tolist(),
                is_smooth=true,  # 平滑曲线
                symbol="none",  # 取消数据点标记
                linestyle_opts=opts.linestyleopts(
                    color=self.ma_colors[period],  # 颜色
                    width=2  # 线宽
                ),
                label_opts=opts.labelopts(is_show=false)  # 隐藏数据标签
            )

        # 叠加 k 线和均线
        overlap_kline = kline.overlap(line)

        # ================== 成交量柱状图 ==================
        vol_bar = (
            bar()
            .add_xaxis(self.dates)
            .add_yaxis(
                series_name="成交量",
                y_axis=self.df[['index_vol', '成交量', 'color']].values.tolist(),
                label_opts=opts.labelopts(is_show=false),  # 隐藏标签
                
            )
            .set_global_opts(
                xaxis_opts=opts.axisopts(
                    type_="category",
                    grid_index=1,
                    axislabel_opts=opts.labelopts(is_show=false),
                    axistick_opts=opts.axistickopts(is_show=false),
                    splitline_opts=opts.splitlineopts(is_show=false)
                ),
                yaxis_opts=opts.axisopts(is_show=false),
                legend_opts=opts.legendopts(is_show=false),
                visualmap_opts=opts.visualmapopts(
                    is_show=false,
                    dimension=2,  # 颜色映射使用的维度(color)
                    series_index=4,  # 作用于第 5 个系列(成交量)
                    is_piecewise=true,  # 分段显示
                    pieces=[
                        {"value": 1, "color": self.color_up},  # 上涨颜色
                        {"value": -1, "color": self.color_down}  # 下跌颜色
                    ]
                )
            )
        )

        # ================== 组合图表 ==================
        grid = (
            grid(init_opts=opts.initopts(
                width="98vw",
                height="95vh",
                animation_opts=opts.animationopts(animation=false)  # 关闭动画
            ))
            .add(overlap_kline, grid_opts=opts.gridopts(pos_top="10%", height="60%" ,pos_left="30px",pos_right="10px"))
            .add(vol_bar, grid_opts=opts.gridopts(pos_top="73%", height="20%" ,pos_left="30px",pos_right="10px"))
        )

        return grid

    def render(self, file_path: str = "stock_kline.html"):
        """ 渲染并保存 k 线图 """
        chart = self.create_chart()
        chart.render(file_path)
        print(f"k 线图已保存为 {file_path}")

这是如何调用的方法在stockklinechart.py所在目录下新建一个main.py文件

import akshare as ak
import stockklinechart as skc

# 获取股票数据
df = ak.stock_zh_a_hist(
    symbol="000001",       # 股票代码
    period="daily",        # 日线数据
    start_date="20230101", # 起始日期
    end_date="20251201",   # 结束日期
    adjust="qfq"           # 前复权处理
)

# 创建 k 线图实例
stock_chart = skc.stockklinechart(df=df, stock_code="000001")
stock_chart.render()

运行成功以后会在目录下生成一个stock_kline.html文件,用谷歌浏览器打开就能看到了。

结语

好了,文章基本上就写到这里了,对于pyecharts配置有疑问的可以参考下这张图:

如果你也在用 pyecharts 做可视化,希望这篇文章能帮你少走点弯路!

到此这篇关于一文教你使用python绘制丝滑的k线图的文章就介绍到这了,更多相关python绘制k线图内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com