pyecharts源码解读(9)渲染包render之engine模块:渲染引擎

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

当前pyecharts版本为1.9.0

概述

render包结构

render包位于pyecharts包顶级目录中,用于渲染图表。render包结构如下:

├─render # 渲染设置包
│  │  display.py # 定义HTML、JavaScript显示类,用于支持在notebook中嵌入输出结果
│  │  engine.py # 定义渲染相关类、函数
│  │  snapshot.py # 定义渲染图片函数
│  │  __init__.py # 暴露渲染图片函数
│  │
│  ├─templates # 定义渲染模板
│  │      components.html
│  │      macro
│  │      nb_components.html
│  │      nb_jupyter_globe.html
│  │      nb_jupyter_lab.html
│  │      nb_jupyter_lab_tab.html
│  │      nb_jupyter_notebook.html
│  │      nb_jupyter_notebook_tab.html
│  │      nb_nteract.html
│  │      simple_chart.html
│  │      simple_globe.html
│  │      simple_page.html
│  │      simple_tab.html

engine模块

engine模块,路径为pyecharts/render/engine.py,作用为提供渲染接口(HTML和notebook)。

engine模块的结构如下图所示。

  • write_utf8_html_file(file_name: str, html_content: str)函数:根据HTML字符串生成HTML文件。
  • RenderEngine(env: Optional[Environment] = None)类:根据jinja2的环境变量提供渲染抽象接口。
  • render(chart, path: str, template_name: str, env: Optional[Environment], **kwargs) -> str函数:封装RenderEngine(env: Optional[Environment] = None)render_chart_to_file方法输出HTML文件。返回值为输出的HTML文件的路径。
  • render_embed(chart, template_name: str, env: Optional[Environment], **kwargs) -> str函数:封装RenderEngine(env: Optional[Environment] = None)render_chart_to_template方法输出HTML字符串。返回值为字符串。
  • render_notebook(self, notebook_template, lab_template)函数:将图表嵌入到notebook中,针对不同notebook类型提供不同输出方式。notebook和jupyter lab封装RenderEngine(env: Optional[Environment] = None)render_chart_to_notebook方法实现。返回值为pyecharts.render.display.HTML类对象。
  • load_javascript(chart)函数:为jupyter lab提供JavaScript支持,根据chart对象的JavaScript依赖库生成JavaScript代码。返回值为pyecharts.render.display.Javascript类对象。

在这里插入图片描述

engine模块的应用

根据图表对象基类Base的源码可知,图表类的渲染方法底层底层由engine模块的相应类、函数实现。

pyecharts/charts/base.py模块源码

from ..render import engine

class Base(ChartMixin):
    """
    `Base` is the root class for all graphical class, it provides
    part of the initialization parameters and common methods
    """

    def __init__(self, init_opts: Union[InitOpts, dict] = InitOpts()):
        _opts = init_opts
        if isinstance(init_opts, InitOpts):
            _opts = init_opts.opts

    def render(
        self,
        path: str = "render.html",
        template_name: str = "simple_chart.html",
        env: Optional[Environment] = None,
        **kwargs,
    ) -> str:
        self._prepare_render()
        return engine.render(self, path, template_name, env, **kwargs)

    def render_embed(
        self,
        template_name: str = "simple_chart.html",
        env: Optional[Environment] = None,
        **kwargs,
    ) -> str:
        self._prepare_render()
        return engine.render_embed(self, template_name, env, **kwargs)

    def render_notebook(self):
        self.chart_id = uuid.uuid4().hex
        self._prepare_render()
        return engine.render_notebook(
            self, "nb_jupyter_notebook.html", "nb_jupyter_lab.html"
        )

pyecharts/render/engine.py模块源码

import os
from collections import Iterable

from jinja2 import Environment

from ..commons import utils
from ..datasets import EXTRA, FILENAMES
from ..globals import CurrentConfig, NotebookType
from ..types import Any, Optional
from .display import HTML, Javascript


def write_utf8_html_file(file_name: str, html_content: str):
    with open(file_name, "w+", encoding="utf-8") as html_file:
        html_file.write(html_content)


class RenderEngine:
    def __init__(self, env: Optional[Environment] = None):
        self.env = env or CurrentConfig.GLOBAL_ENV

    @staticmethod
    def generate_js_link(chart: Any) -> Any:
        if not chart.js_host:
            chart.js_host = CurrentConfig.ONLINE_HOST
        links = []
        for dep in chart.js_dependencies.items:
            # TODO: if?
            if dep.startswith("https://api.map.baidu.com"):
                links.append(dep)
            if dep in FILENAMES:
                f, ext = FILENAMES[dep]
                links.append("{}{}.{}".format(chart.js_host, f, ext))
            else:
                for url, files in EXTRA.items():
                    if dep in files:
                        f, ext = files[dep]
                        links.append("{}{}.{}".format(url, f, ext))
                        break
        chart.dependencies = links
        return chart

    def render_chart_to_file(self, template_name: str, chart: Any, path: str, **kwargs):
        """
        Render a chart or page to local html files.

        :param chart: A Chart or Page object
        :param path: The destination file which the html code write to
        :param template_name: The name of template file.
        """
        tpl = self.env.get_template(template_name)
        html = utils.replace_placeholder(
            tpl.render(chart=self.generate_js_link(chart), **kwargs)
        )
        write_utf8_html_file(path, html)

    def render_chart_to_template(self, template_name: str, chart: Any, **kwargs) -> str:
        tpl = self.env.get_template(template_name)
        return utils.replace_placeholder(
            tpl.render(chart=self.generate_js_link(chart), **kwargs)
        )

    def render_chart_to_notebook(self, template_name: str, **kwargs) -> str:
        tpl = self.env.get_template(template_name)
        return utils.replace_placeholder(tpl.render(**kwargs))


def render(
    chart, path: str, template_name: str, env: Optional[Environment], **kwargs
) -> str:
    RenderEngine(env).render_chart_to_file(
        template_name=template_name, chart=chart, path=path, **kwargs
    )
    return os.path.abspath(path)


def render_embed(
    chart, template_name: str, env: Optional[Environment], **kwargs
) -> str:
    return RenderEngine(env).render_chart_to_template(
        template_name=template_name, chart=chart, **kwargs
    )


def render_notebook(self, notebook_template, lab_template):
    instance = self if isinstance(self, Iterable) else (self,)
    if CurrentConfig.NOTEBOOK_TYPE == NotebookType.JUPYTER_NOTEBOOK:
        require_config = utils.produce_require_dict(self.js_dependencies, self.js_host)
        return HTML(
            RenderEngine().render_chart_to_notebook(
                template_name=notebook_template,
                charts=instance,
                config_items=require_config["config_items"],
                libraries=require_config["libraries"],
            )
        )

    if CurrentConfig.NOTEBOOK_TYPE == NotebookType.JUPYTER_LAB:
        return HTML(
            RenderEngine().render_chart_to_notebook(
                template_name=lab_template, charts=instance
            )
        )

    if CurrentConfig.NOTEBOOK_TYPE == NotebookType.NTERACT:
        return HTML(self.render_embed())

    if CurrentConfig.NOTEBOOK_TYPE == NotebookType.ZEPPELIN:
        print("%html " + self.render_embed())


def load_javascript(chart):
    scripts = []
    for dep in chart.js_dependencies.items:
        f, ext = FILENAMES[dep]
        scripts.append("{}{}.{}".format(CurrentConfig.ONLINE_HOST, f, ext))
    return Javascript(lib=scripts)
使用pycharts绘制图表 以上的方法中的参数path表示生成文件的路径,默认为render.html;template_name表示模版的路径。redenr()方法会返回HTML文件的路径字符串。pyecharts的Pis类表示饼图,该类中提供可一个add()方法,使用add()方法可以为饼图添加数据和配置项。图表基类Base主要提供了两个渲染图表的方法:render()和render_notebook()。表3. 全国药店中药饮片供应商占比情况。表2. 中药材消费者画像数据。 阅读详情

相关推荐

SurfaceFlinger, RenderEngine和Skia

如果 SurfaceFlinger 需要实现这些效果,直接调用 Skia 比手写 OpenGL GLSL 代码更方便,也可能更高效。:手写 OpenGL 代码时,开发者往往需要自己管理这些优化,而 Skia 自动帮你处理了很多问题,能让 GPU 利用率更高。这个问题很好,Skia 底层确实是基于 OpenGL 或 Vulkan 来进行 GPU 加速的,但。,因为 Skia 生成的图像最终需要通过 SurfaceFlinger 进行合成并显示到屏幕上。,但它也涉及一定的渲染Rendering)。

Damon_X的博客 1889

python 的使用 (二)——pyecharts

Echarts是百度出的很有名 也很叼。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。 pyecharts 是一个用于生成 Echarts 图表的类库。实际上就是 Echarts 与 Python 的对接。网址: https://github.com/chenjiandongx/pyecharts/blob/master/docs/zh-cn/documentatio...

爱吃串串的瘦子的博客 1万+

Python pyecharts 数据可视化

pyecharts:python 调用echarts库,echarts 是开源的可视化工具,有丰富的图表展示功能。

sinat_39027078的博客 5614

【python 可视化】pyecharts + Flask 使用指南

本指南会以一个小的 Flask 项目为例,说明如何在 Flask 中使用 pyecharts。请确保你已经安装 Flask,还没安装请执行 pip install flask 或其他方式安装。Step 0: 首先新建一个 Flask 项目Linux/macos 系统$ mkdir flask-echarts $ cd flask-echarts $ mkdir templatesWindows 系统

赖德发的博客 2万+

django项目中pyecharts详细使用教程1

1. 柱状图的制作 from django.shortcuts import render from pyecharts.charts import Bar from django.conf import settings def zhu_zhuang(request): bar = Bar() bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]) bar.add_yaxis("商家A", [5, 20, 36, 10,

weixin_42289273的博客 1万+

pyecharts源码解读(18)HTML组件components之图像组件Image

当前pyecharts的版本为1.9.0。 components概述 components位于pyecharts顶级目录中,用于定义pyecharts的HTML组件。结构如下: ├─components # HTML组件 │ │ image.py # 定义图像组件类Image │ │ table.py # 定义表格组件类Table │ │ __init__.py # 重构命名空间,将组件类命名空间提升至components命名空间 目前HTML组件类Table 和Image 与复合

mighty13的专栏 3万+

Pyecharts库及其与Django的结合使用

在上一周发表的echarts和Django的结合使用中,有粉丝提出想要学习下pyecharts,我特地花了点时间研究了下,写出此篇文章,希望喜欢的能够给我点点赞~ 这篇文章不会提到太多的语法,也不会把每个图形都讲一遍,还是那句话,作为初学者,我们先要模仿着写。官方文档对图形使用的解析已经很清楚了,我只抓取我感觉比较重要的讲一些。 代码仓库地址还是原来的那个地址,示例资源和静态资源文件都已经集成到这个项目里了。 https://gitcode.net/sabian2/myechartdemo 简介 Echar

Amoor的博客 4956

pyecharts绘图

基本介绍 pyecharts是一个基于百度开发的echarts的一个第三方库,它绘制的图像功能更强大。交互性比较强,在用作展示等方面是一个值得使用的第三方库。在了解这个第三方库之前我们了解一下Echarts. ECharts是一个免费的、功能强大的、可视化的一个库。它可以非常简单的往软件产品中添加直观的、动态的和高度可定制化的图表。它是一个全新的基于zrender的用纯JavaScript打造完...

qq_42370313的博客 6067

Pyecharts使用JScode回调函数时遇到的函数内换行符失效问题

前记:这个准确来说不是问题,是bug……我愿意把它评为我今年遇到的最折磨人的bug;这个bug很少有人能踩坑,原因主要是bug触发的条件比较苛刻(看题目一长串就知道了): 需要在pyecharts中使用JScode(一般来说,当label、tooltips里面想要显示一些特殊的内容时,而formatter的字符串模板形式并不支持时,只能用jscode来实现) JScode中返回的字符串有换行需求,即插入换行符“\n” 使用pyecharts时习惯先创建一个pyecharts对象,然后再通过对象调用渲染

link_in_csdn的博客 3668

python pyecharts render_【python 可视化】pyecharts + Flask 使用指南

本指南会以一个小的 Flask 项目为例,说明如何在 Flask 中使用 pyecharts。请确保你已经安装 Flask,还没安装请执行 pip install flask 或其他方式安装。Step 0: 首先新建一个 Flask 项目Linux/macos 系统$mkdir flask-echarts$cd flask-echarts$mkdir templatesWindows 系统新建一个...

weixin_39902472的博客 3184

Android Render

Render渲染):Render是Android系统中负责将绘制指令转化为实际图像的模块。它负责将Canvas中的绘制操作转化为最终的像素数据,并将其显示在屏幕上。Render会根据硬件设备的性能和特性,选择合适的渲染方式,如使用GPU进行硬件加速渲染Render还会处理图像的混合、遮罩、滤镜等效果,以及处理动画效果。Android渲染是指将应用程序的用户界面(UI)元素绘制到设备屏幕上的过程。Android系统使用一种称为View系统的机制来处理UI渲染

liuning1985622的博客 1735

使用Pyecharts渲染图表

在anaconda prompt命令行工具下,通过pip清华镜像源安装pyechartsecharts官网:https://www.echartsjs.com/index.htmlpyecharts官网:https://pyecharts.org/#/zh-cn/intropyecharts众多图表示例代码:https://gallery.pyecharts.org/#/README。

Enticelove的博客 1372

python pyecharts render_Python+pyecharts: 强大的数据可视化工具!()

学习了numpy,pandas,matplotlib之后,是不是对matplotlib的画图功能感到不满意,都9012年了,动态效果都没有的图片让人抓狂。出色的ECharts相信大家也都听说过,制作的表格非常的优雅。不过对于前端一塌糊涂的我来说,想要快速上手ECharts还是有难度的,还好我们有万能的python,果不其然。简单的搜索,发现已经有国内的牛人大神帮我们开发好了。python的强大之一...

weixin_29309213的博客 2584

pyecharts数据可视化

参考连接: https://www.jianshu.com/p/52dbe714d2f6 pyecharts绘图准备 pyecharts的安装: 首先现需要安装完毕pyecharts库:pip install pyecharts 导入相关模块pyecharts库中负责地理坐标系的模块是 Geo,负责地图的模块是 Map,负责百度地图的模块是 BMap,负责图表配置的模块是 opt...

软件工程 1071

pyecharts源码解读(15)图表类charts之组合图表: 选项卡Tab

当前pyecharts的版本为1.9.0。 概述 pyecharts/charts/composite_charts/中的四个模块分别定义了组合图表类,其中pyecharts/charts/composite_charts/tab.py模块只定义了选项卡类Tab。 Tab类继承自图表基类CompositeMixin,作用为利用选项卡(tab)控制多个图表的展示。输出的HTML结构如下: 创建一个选项div,每个图表对应一个按钮, 用于切换显示图表。 创建一个图表div,每个图表构造一个单独的div,作为图

mighty13的专栏 3万+

使用Pyecharts渲染图表(2

pyecharts github项目国内镜像: https://gitee.com/mirrors/pyechartspyecharts众多图表示例代码:https://gallery.pyecharts.org/#/README。pyecharts官网:https://pyecharts.org/#/zh-cn/intro。echarts官网:https://www.echartsjs.com/index.html。使用pyecharts进行开发前,开发者需要先在本地计算机安装pyecharts

Snyia的博客 709

Pyechart绘图基础

调用方式与存储方式 (1)两种调用方式: 链式调用 单独方法调用 (2)三种存储方式: 保存为html文件:实例名.render(r"路径+文件名") 在notebook里直接显示:实例名.render_notebook() 保存为png等图片 # =============================================================...

Gfqwy2021 2558

PyEchart 开发快速入门

我在“04 | 图表组件:Echarts数据可视化图表基础”这一课时中简单介绍了 PyEcharts 的参数配置项和图表元素之间的映射关系:PyEcharts 图表配置项这里,我将详细介绍具体的配置项的参数设置方法。PyEcharts 配置项分全局配置项和系列配置项,其中全局配置项作用域为整个图表(与具体需要呈现的数据内容无关),可以理解为静态部分;系列配置项作用范围为基于数据动态绘制的部分。序号类名称主要功能1初始化配置项尺寸、主题样式2工具箱配置项是否显示、位置、工具项3。

我乐了的博客 1112
上一篇: pyecharts源码解读(8)渲染包render之snapshot模块:将结果渲染为图片
下一篇: pyecharts源码解读(10)渲染包render之templates目录:渲染模板
mighty13
博客等级 码龄23年 727粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值