在一些场景中,不方便单独启动一个本地服务去挂载 pyecharts 的所有静态资源,此时就无法更改全局 hosts 去直接指向本地静态资源文件地址。此时我们可以重写库文件中的 Javascript.load_javascript_contents 方法将所需要的 js 代码全部写入到 html 文件中,但是这样会导致 html 文件的臃肿。
具体步骤如下:
一、下载离线 js 文件
GitHub 下载地址:https://github.com/pyecharts/pyecharts-assets
将这个地方的文件下载成为一个 zip 文件,保存至本地的一个指定路径。这个里面包含了大多数示例中所用到的 js 文件。

二、重写库文件方法

from pathlib import Path
from pyecharts.render.display import Javascript


# 定义新的load_javascript_contents函数
def new_js(self):
    for lib in self.lib:
        work_path = str(Path.cwd()) + "/pyecharts-assets-master/assets/v5/"
        new_lib = lib.replace("https://assets.pyecharts.org/assets/v5/", f"{work_path}")
        with open(new_lib, "r", encoding="utf-8") as f:
            self.javascript_contents[lib] = f.read()
            f.close()
        continue
    return self


Javascript.load_javascript_contents = new_js

Tips:
1、在进行 work_path 的获取和拼接的时候,需要注意你的离线 js 文件所存放的路径,这里是将父文件夹 pyecharts-assets-master 与代码文件放在了同一级目录中。
2、**在使用较新版本的 pyecharts 的时候,需要再创建图表对象的时候,有一个渲染配置项 RenderOpts ,其含义为是否在渲染HTML时嵌入JS文件,默认False不嵌入,在这里需要给他赋值为 True **



完整代码:

import json
import os
from pathlib import Path
# 导入 Line 功能对象构建折线图对象
from pyecharts.charts import Line
# 标题选项所有的可配置的选项所在包
from pyecharts.options import *
# 重写库文件中的Javascript.load_javascript_contents方法,将js文件内容内嵌入html文件中
from pyecharts.render.display import Javascript

file_name = r"C:\Users\Admin\Desktop\fsdownload\curName.json"


# 定义新的load_javascript_contents函数
def new_js(self):
    for libpath in self.lib:
        work_path = str(Path.cwd()) + "/pyecharts-assets-master/assets/v5/"
        new_lib = libpath.replace("https://assets.pyecharts.org/assets/v5/", f"{work_path}")
        with open(new_lib, "r", encoding="utf-8") as f:
            self.javascript_contents[libpath] = f.read()
            f.close()
        continue
    return self


def readJsonDate(filename):
    # 读取json文件
    json_data = open(filename, "r", encoding="UTF-8")
    number = json_data.read()
    json_data.close()

    return number


def lineChart():
    number = readJsonDate(file_name)
    # 使用 json.loads()  方法,将 json 数据转换为 Python 中的列表 list
    pydata = json.loads(number)
    rate = []  # 存放汇率
    country = []  # 存放国家信息
    for data in pydata:
        for t in range(len(data)):
            rate.append(data[t]["rate"])
            country.append(data[t]["country"])
    # 创建折线图对象
    # 先重写获取调用 js 文件的方法
    # Javascript.load_javascript_contents = new_js
    # 创建图表对象,并设置渲染嵌入 js 代码配置项为 True
    line = Line(render_opts=RenderOpts(is_embed_js=True))
    # 设置x轴数据
    line.add_xaxis(country[:10])
    # 设置 y 轴数据
    line.add_yaxis(series_name="汇率", y_axis=rate[:10], )
    # 设置全局配置项
    line.set_global_opts(title_opts=TitleOpts(title="跨国汇率图", pos_left="center", pos_bottom="90%"))
    # 生成图表
    line.render("rate.html")
    os.startfile("rate.html")


if __name__ == '__main__':
    Javascript.load_javascript_contents = new_js
    lineChart()

在定义新的 load_javascript_contents 函数之后,在进行绘制图表之前需要将其调用赋给 Javascript.load_javascript_contents 方法。可以在绘图方法内部调用赋值(需要在每一个方法中都做一次调用操作),也可以在 main 方法中一次性调用赋值。

注意:使用这个方法将 js 代码全部写入到 html 代码文件中时,会使得 html 文件较为臃肿,使用时需要慎重考虑。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_65740074/article/details/136285997

posted on 2024-04-17 17:36  Hy旧人伤  阅读(22)  评论(0编辑  收藏  举报