[图表]pyecharts-K线图

news2024/11/26 22:45:30

[图表]pyecharts-K线图

先来看代码:

import requests
from typing import List, Union

from pyecharts import options as opts
from pyecharts.charts import Kline, Line, Bar, Grid


def get_data():
    response = requests.get(
        url="https://echarts.apache.org/examples/data/asset/data/stock-DJI.json"
    )
    json_response = response.json()
    # 解析数据
    return split_data(data=json_response)


def split_data(data):
    category_data = []
    values = []
    volumes = []

    for i, tick in enumerate(data):
        category_data.append(tick[0])
        values.append(tick)
        volumes.append([i, tick[4], 1 if tick[1] > tick[2] else -1])
    return {"categoryData": category_data, "values": values, "volumes": volumes}


def calculate_ma(day_count: int, data):
    result: List[Union[float, str]] = []
    for i in range(len(data["values"])):
        if i < day_count:
            result.append("-")
            continue
        sum_total = 0.0
        for j in range(day_count):
            sum_total += float(data["values"][i - j][1])
        result.append(abs(float("%.3f" % (sum_total / day_count))))
    return result


def draw_charts():
    kline_data = [data[1:-1] for data in chart_data["values"]]
    kline = (
        Kline()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="Dow-Jones index",
            y_axis=kline_data,
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"),
        )
        .set_global_opts(
            legend_opts=opts.LegendOpts(
                is_show=False, pos_bottom=10, pos_left="center"
            ),
            datazoom_opts=[
                opts.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    xaxis_index=[0, 1],
                    range_start=98,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    xaxis_index=[0, 1],
                    type_="slider",
                    pos_top="85%",
                    range_start=98,
                    range_end=100,
                ),
            ],
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                ),
            ),
            tooltip_opts=opts.TooltipOpts(
                trigger="axis",
                axis_pointer_type="cross",
                background_color="rgba(245, 245, 245, 0.8)",
                border_width=1,
                border_color="#ccc",
                textstyle_opts=opts.TextStyleOpts(color="#000"),
            ),
            visualmap_opts=opts.VisualMapOpts(
                is_show=False,
                dimension=2,
                series_index=5,
                is_piecewise=True,
                pieces=[
                    {"value": 1, "color": "#00da3c"},
                    {"value": -1, "color": "#ec0000"},
                ],
            ),
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{"xAxisIndex": "all"}],
                label=opts.LabelOpts(background_color="#777"),
            ),
            brush_opts=opts.BrushOpts(
                x_axis_index="all",
                brush_link="all",
                out_of_brush={"colorAlpha": 0.1},
                brush_type="lineX",
            ),
        )
    )

    line = (
        Line()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="MA5",
            y_axis=calculate_ma(day_count=5, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA10",
            y_axis=calculate_ma(day_count=10, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA20",
            y_axis=calculate_ma(day_count=20, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA30",
            y_axis=calculate_ma(day_count=30, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
    )

    bar = (
        Bar()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="Volume",
            y_axis=chart_data["volumes"],
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(
            xaxis_opts=opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

    # Kline And Line
    overlap_kline_line = kline.overlap(line)

    # Grid Overlap + Bar
    grid_chart = Grid(
        init_opts=opts.InitOpts(
            width="1000px",
            height="800px",
            animation_opts=opts.AnimationOpts(animation=False),
        )
    )
    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%"),
    )
    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(
            pos_left="10%", pos_right="8%", pos_top="63%", height="16%"
        ),
    )

    grid_chart.render("professional_kline_brush.html")


if __name__ == "__main__":
    chart_data = get_data()
    draw_charts()

再来看结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

再来看不那么详细的解析:(太多了)

这段代码使用了Python中的一些模块来生成一个包含K线图、折线图和柱状图的可视化图表。以下是对代码的详细解析和代码注释:

import requests
from typing import List, Union

from pyecharts import options as opts
from pyecharts.charts import Kline, Line, Bar, Grid

导入了需要使用的模块,包括requests用于发送HTTP请求,ListUnion用于类型提示,以及KlineLineBarGrid模块用于生成图表。

def get_data():
    response = requests.get(
        url="https://echarts.apache.org/examples/data/asset/data/stock-DJI.json"
    )
    json_response = response.json()
    # 解析数据
    return split_data(data=json_response)

定义了一个函数get_data(),该函数使用requests模块发送HTTP请求获取数据。数据来自"https://echarts.apache.org/examples/data/asset/data/stock-DJI.json"这个URL。然后将获取到的JSON数据解析,并调用split_data()函数对数据进行处理。

def split_data(data):
    category_data = []
    values = []
    volumes = []

    for i, tick in enumerate(data):
        category_data.append(tick[0])
        values.append(tick)
        volumes.append([i, tick[4], 1 if tick[1] > tick[2] else -1])
    return {"categoryData": category_data, "values": values, "volumes": volumes}

定义了一个函数split_data(data),该函数将获取到的JSON数据进行处理和分割。将时间序列、数据和成交量分别存储在category_datavaluesvolumes变量中,然后将它们作为字典的键值返回。

def calculate_ma(day_count: int, data):
    result: List[Union[float, str]] = []
    for i in range(len(data["values"])):
        if i < day_count:
            result.append("-")
            continue
        sum_total = 0.0
        for j in range(day_count):
            sum_total += float(data["values"][i - j][1])
        result.append(abs(float("%.3f" % (sum_total / day_count))))
    return result

定义了一个函数calculate_ma(day_count, data),该函数用于计算移动平均线(Moving Average)。通过遍历数据并根据给定的天数计算移动平均线的值,然后将结果存储在result列表中并返回。

def draw_charts():
    kline_data = [data[1:-1] for data in chart_data["values"]]
    kline = (
        Kline()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="Dow-Jones index",
            y_axis=kline_data,
            itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"),
        )
        .set_global_opts(
            legend_opts=opts.LegendOpts(
                is_show=False, pos_bottom=10, pos_left="center"
            ),
            datazoom_opts=[
                opts

.DataZoomOpts(
                    is_show=False,
                    type_="inside",
                    xaxis_index=[0, 1],
                    range_start=98,
                    range_end=100,
                ),
                opts.DataZoomOpts(
                    is_show=True,
                    xaxis_index=[0, 1],
                    type_="slider",
                    pos_top="85%",
                    range_start=98,
                    range_end=100,
                ),
            ],
            yaxis_opts=opts.AxisOpts(
                is_scale=True,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                ),
            ),
            tooltip_opts=opts.TooltipOpts(
                trigger="axis",
                axis_pointer_type="cross",
                background_color="rgba(245, 245, 245, 0.8)",
                border_width=1,
                border_color="#ccc",
                textstyle_opts=opts.TextStyleOpts(color="#000"),
            ),
            visualmap_opts=opts.VisualMapOpts(
                is_show=False,
                dimension=2,
                series_index=5,
                is_piecewise=True,
                pieces=[
                    {"value": 1, "color": "#00da3c"},
                    {"value": -1, "color": "#ec0000"},
                ],
            ),
            axispointer_opts=opts.AxisPointerOpts(
                is_show=True,
                link=[{"xAxisIndex": "all"}],
                label=opts.LabelOpts(background_color="#777"),
            ),
            brush_opts=opts.BrushOpts(
                x_axis_index="all",
                brush_link="all",
                out_of_brush={"colorAlpha": 0.1},
                brush_type="lineX",
            ),
        )
    )

    line = (
        Line()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="MA5",
            y_axis=calculate_ma(day_count=5, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA10",
            y_axis=calculate_ma(day_count=10, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA20",
            y_axis=calculate_ma(day_count=20, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .add_yaxis(
            series_name="MA30",
            y_axis=calculate_ma(day_count=30, data=chart_data),
            is_smooth=True,
            is_hover_animation=False,
            linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))
    )

    bar = (
        Bar()
        .add_xaxis(xaxis_data=chart_data["categoryData"])
        .add_yaxis(
            series_name="Volume",
            y_axis=chart_data["volumes"],
            xaxis_index=1,
            yaxis_index=1,
            label_opts=opts.LabelOpts(is_show=False),
        )
        .set_global_opts(
            xaxis_opts=

opts.AxisOpts(
                type_="category",
                is_scale=True,
                grid_index=1,
                boundary_gap=False,
                axisline_opts=opts.AxisLineOpts(is_on_zero=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                split_number=20,
                min_="dataMin",
                max_="dataMax",
            ),
            yaxis_opts=opts.AxisOpts(
                grid_index=1,
                is_scale=True,
                split_number=2,
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                axistick_opts=opts.AxisTickOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            legend_opts=opts.LegendOpts(is_show=False),
        )
    )

创建了一个K线图实例kline,并使用.add_xaxis()方法设置x轴数据,使用.add_yaxis()方法添加K线图的系列数据,其中系列名称为"Dow-Jones index",y轴数据为kline_data,并设置了颜色样式。使用.set_global_opts()方法设置图表的全局配置,包括图例、数据缩放、坐标轴、提示框、可视映射等。

创建了一个折线图实例line,并使用.add_xaxis()方法设置x轴数据,使用.add_yaxis()方法添加折线图的系列数据,其中包括"MA5"、“MA10”、"MA20"和"MA30"这四个系列,y轴数据通过调用calculate_ma()函数计算得到,设置了平滑曲线、不显示标签等样式,并使用.set_global_opts()方法设置x轴的配置。

创建了一个柱状图实例bar,并使用.add_xaxis()方法设置x轴数据,使用.add_yaxis()方法添加柱状图的系列数据,其中系列名称为"Volume",y轴数据为chart_data["volumes"],并设置了一些轴和坐标轴的配置。

    overlap_kline_line = kline.overlap(line)

    grid_chart = Grid(
        init_opts=opts.InitOpts(
            width="1000px",
            height="800px",
            animation_opts=opts.AnimationOpts(animation=False),
        )
    )
    grid_chart.add(
        overlap_kline_line,
        grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="50%"),
    )
    grid_chart.add(
        bar,
        grid_opts=opts.GridOpts(
            pos_left="10%", pos_right="8%", pos_top="63%", height="16%"
        ),
    )

    grid_chart.render("professional_kline_brush.html")

使用.overlap()方法将K线图和折线图进行重叠叠加得到overlap_kline_line。创建了一个网格图表grid_chart,并设置了初始配置,包括宽度、高度和动画效果。使用.add()方法将叠加后的图表overlap_kline_line和柱状图bar添加到网格图表中,并

设置了网格的位置和高度。最后调用.render()方法将图表保存为HTML文件,文件名为"professional_kline_brush.html"。

以上就是这段代码的解析和注释说明。这段代码使用了pyecharts库来生成包含K线图、折线图和柱状图的可视化图表,使用了HTTP请求获取数据,并对数据进行处理和分析,最终生成一个交互式的图表页面。

注:图表资源来源于:
pyecharts-gallery
本站只提供常用图表与其解析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻击者使用 Python 编译的字节码来逃避检测

以 PyPI&#xff08;Python 包索引&#xff09;等开源包存储库为目标的攻击者设计了一种新技术&#xff0c;可以将他们的恶意代码隐藏在安全扫描器、人工审查和其他形式的安全分析中。 在一次事件中&#xff0c;研究人员发现恶意软件代码隐藏在 Python 字节码 (PYC) 文件中&am…

Scala学习(十二)---模式匹配

文章目录 1.基本语法2.模式守卫3.匹配常量和类型4.匹配对象和样例类4.1 匹配对象4.2 匹配样例类 5.偏函数中的模式匹配 1.基本语法 在Scala中的模式匹配类似于Java中的switch语法 //模式匹配基本语法val a10val b20val c""c match {case "" >println(…

VScode远程连接虚拟机(ubuntu系统)

文章目录 1. Windows端安装VScode2. 安装远程登录插件3. 配置Remote-SSH插件关于关闭后如何打开该配置文件 4. 测试ubuntu与windows可否ping通5. 在Ubuntu中安装 SSH1.检查是否安装ssh-server2.安装openssh-server3.查看ssh服务是否启动4.Ubuntu中配置openssh-server开机自动启…

路径规划算法:基于蝠鲼觅食优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于蝠鲼觅食优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蝠鲼觅食优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

6.4下周黄金最新行情走势分析及开盘交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(6月2日)&#xff0c;美市尾盘&#xff0c;现货黄金收报1947.82美元/盎司&#xff0c;大幅下跌29.70美元或1.50%&#xff0c;日内最高触及1983.43美元/盎司&…

chatgpt赋能python:Python升序排序

Python升序排序 Python是一种非常强大的编程语言&#xff0c;它在数学计算、数据处理等方面具备很强的优势。在实际应用中&#xff0c;我们经常需要对一系列数据进行排序。而在Python中&#xff0c;升序排序是非常常见的操作。本篇文章将介绍在Python中如何使用ifelse进行升序…

JavaWeb13(ajax01 AJAX介绍AJAX登陆AJAX加入购物车AJAX修改购物车商品数量)

目录 一. 什么是ajax 二.为什么需要AJAX? 三. 同步和异步的区别. 四.基于jQuery实现AJAX语法 4.1 语法1-$.ajax(url,[settings]). 4.1 语法2-$.get/post(url, [data], [callback], [type]). 五 .案例 5.1 ajax实现登录 ①html代码 用户登录 用户名&#xff1a; 密码…

【无功优化】基于改进教与学算法的配电网无功优化【IEEE33节点】(Matlab代码时候)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

揭秘照片修复技巧:手把手教你如何让模糊照片变清晰

作为一名修图小能手&#xff0c;行走于修图界&#xff0c;修复模糊的照片是必备的技能之一&#xff0c;最近收到很多粉丝的私信&#xff0c;清一色都是问的怎么免费把照片变清晰&#xff0c;为了给各位小伙伴们解决难题&#xff0c;我决定拿出我私藏多年的秘密武器&#xff0c;…

【CloudCompare教程】016:计算点云的法向量

本文讲解CloudCompare计算点云的法向量的方法。 文章目录 一、法向量概述二、法向量计算1. 平面法向量2. 二次曲面3.三角网格化一、法向量概述 法向量,是空间解析几何的一个概念,垂直于平面的直线所表示的向量为该平面的法向量。法向量适用于解析几何。由于空间内有无数个直…

HAL库记录-RTC

芯片:STM32F29IIGT6 阿波罗开发板 1.配置时钟 2.HAL外设配置 3.代码解析 生成rtc文件 RTC_HandleTypeDef hrtc;/* RTC init function */ void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 */RTC_TimeTypeDef rtc_time;RTC_DateTypeDef rtc_data;/* USER CODE END RTC…

node笔记_生成自定义目录文件

文章目录 ⭐前言⭐node生成目录&#x1f496; mkdirSync创建目录&#x1f496; stat判断目录是否存在&#x1f496; mkdir创建目录&#x1f496; 动态创建目录文件 ⭐结束 ⭐前言 大家好&#xff01;我是yma16&#xff0c;本文分享node生成自定义目录文件。 背景&#xff1a; …

chatgpt赋能python:Python中去掉数字末尾的0:一种简单有效的方法

Python中去掉数字末尾的0&#xff1a;一种简单有效的方法 Python作为一种流行的编程语言&#xff0c;经常被用于各种应用程序的编写。在这篇文章中&#xff0c;我们将介绍如何使用Python去掉数字末尾的零的一种简单有效的方法。 为什么要去掉数字末尾的0&#xff1f; 对于数…

【工具使用】STM32CubeMX-GPIO配置

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片的GPIO的配置及其相关知识。GPIO…

(转载)基本粒子群算法及惯性权重分析(matlab实现)

1 理论基础 粒子群算法(particle swarm optimization,PSO)是计算智能领域&#xff0c;除了蚁群算法、鱼群算法之外的一种群体智能的优化算法。该算法最早由Kennedy和Eberhart在1995年提出的。PSO算法源于对鸟类捕食行为的研究&#xff0c;鸟类捕食时&#xff0c;找到食物最简单…

一零五九、Windows系统(amd)通过VMware安装黑苹果

我来详细的说一下过程&#xff1a; 配置&#xff1a; windows amd锐龙VMware 16.0 &#xff08;16.1.0 build-17198959&#xff09;macos 11.1unlocker(工具&#xff0c;让虚拟机支持引导苹果系统) 总体步骤&#xff1a; 下载iso镜像和unlocker工具,这里提供两个链接&#…

Spring Cloud Alibaba Nacos 构建配置中心

构建配置中心 新建命名空间 登录 Nacos 面板&#xff0c;依次点击左侧菜单栏【命名空间→新建命名空间】、填写命名空间名和描述信息&#xff0c;点击【确定】&#xff1a; 新建配置文件 依次点击左侧菜单栏【配置管理→配置列表】、切换到指定命名空间【此处为 shop】、点击…

MySQL中的CONCAT()函数和CONCAT_WS()函数

一、介绍 1. CONCAT() MySQL的CONCAT()函数用于将多个字符串连接在一起。它接受两个或多个字符串参数&#xff0c;并返回它们的连接结果。 示例&#xff1a; select concat("hello"," ","world") as concatenated_str; 执行结果&#xff1a…

基于SpringBoot的爱心家园服装捐赠系统

目录 1、项目介绍 2、项目技术 3、运行环境 4、项目介绍 5、项目代码 5、运行截图 6、源码获取 1、项目介绍 角色:管理员、用户 管理员:管理员登录系统后&#xff0c;可以对首页、个人中心、用户管理、捐赠记录管理、论坛管理、留言管理、心愿管理等功能进行相应的操作…

二、KeilMDK+STM32CubeMX建立工程_LED灯闪烁为例

1、开发环境 (1)KeilMDK&#xff1a;V5.38.0.0 (2)STM32CubeMx:V6.8.1 (3)MCU:STM32F407ZGT6 2、实验目的&原理图 2.1、实验目的 实现两个LED灯以500毫秒闪烁一次。 2.2、原理图 (1)LED阴极接GPIO&#xff0c;GPIO输出低电平&#xff0c;LED点亮&#xff1b;GPIO输…