在pyqt5中展示pyecharts生成的图像问题

本文通过一个实际的散点图案例,展示了如何使用pyqt5嵌套一个pyecharts图层的方法,通过这个技巧,可以在pyqt5的框架中也实现精美的数据可视化的功能模块。

技术背景

虽然现在很少有人用python去做一些图形化的界面,但是不得不说我们在日常大部分的软件使用中都还是有可视化与交互这样的需求的。因此pyqt5作为一个主流的python的GUI框架地位是非常重要的,也是一个非常重要的技能。而pyecharts是相当于echarts的python版本,可以比较方便的制作一些非常精美的可视化图片,因为生成的一般是html格式的,所以对于平台的可迁移性相对较好。这里我们主要探索一下在pyqt5制作出来的界面中集成一个pyecharts生成的页面,效果图如下所示:

环境依赖

这里主要依赖于pyecharts和pyqt5这两个库,但是由于pyqt5在5.10.1版本前后经历了比较大的变革,建议是安装最新版本的pyqt5,然后额外安装一个QtWebEngineWidgets的组件(若运行如下程序没有任何报错的话就不需要装):

$ python3 -m pip show pyecharts
Name: pyecharts
Version: 1.9.1
Summary: Python options, make charting easier
Home-page: https://github.com/pyecharts/pyecharts
Author: chenjiandongx
Author-email: chenjiandongx@qq.com
License: MIT
Location: /home/dechin/miniconda3/lib/python3.9/site-packages
Requires: jinja2, prettytable, simplejson
Required-by:
$ python3 -m pip show pyqt5
Name: PyQt5
Version: 5.15.6
Summary: Python bindings for the Qt cross platform application toolkit
Home-page: https://www.riverbankcomputing.com/software/pyqt/
Author: Riverbank Computing Limited
Author-email: info@riverbankcomputing.com
License: GPL v3
Location: /home/dechin/miniconda3/lib/python3.9/site-packages
Requires: PyQt5-Qt5, PyQt5-sip
Required-by: PyQtWebEngine

部分代码解析

这里我们仅仅摘取一小部分的代码进行解析,该示例也是从网上找的一个框架做的修改。首先是数据生成的模块:

import numpy as np
nums = 200
data = np.random.random((nums,2))
data = np.sort(data)
x_data = data[:,0]
y_data = data[:,1]

这里使用numpy来生成一系列的随机数,然后排序后再进行绘图,绘图时采用的pyecharts的Scatter形式散点图。在pyecharts中配置散点图的参数时,主要方法是调用Scatter中的函数来进行构造,比如我们常用的一些窗口工具,区域缩放等功能,就可以在Scatter中添加一个toolbox来实现:

toolbox_opts=opts.ToolboxOpts(
                    is_show=True,
                    orient="horizontal",
                    feature=opts.ToolBoxFeatureOpts(
                        save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(type_="jpeg", title="保存为jpeg", pixel_ratio=2),
                        restore=opts.ToolBoxFeatureRestoreOpts(),
                        data_zoom=opts.ToolBoxFeatureDataZoomOpts(
                            xaxis_index=[0],
                            yaxis_index=[0]
                        ),
                    )
                )

这个toolbox中主要实现了网页另存为图像的功能、区域缩放的功能,以及返回操作的功能。在通过pyecharts构造了图层之后,需要通过:

render("/tmp/scatter.html")

的方法将生成的效果图保存成一个本地的html文件。最后通过pyqt中的图层中导入网页,实现图像的展示效果:

self.mainhboxLayout = QHBoxLayout(self)
self.frame = QFrame(self)
self.mainhboxLayout.addWidget(self.frame)
self.hboxLayout = QHBoxLayout(self.frame)
self.myHtml = QWebEngineView()
self.myHtml.load(QUrl("file:////tmp/scatter.html"))
self.hboxLayout.addWidget(self.myHtml)
self.setLayout(self.mainhboxLayout)

总体代码与展示效果

总体可运行的代码如下所示:

import pyecharts.options as opts
from pyecharts.charts import Scatter
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QFrame
from PyQt5.QtWebEngineWidgets import QWebEngineView
import sys
import numpy as np
class Stacked(QWidget):
    def __init__(self):
        super(Stacked, self).__init__()
        self.initData()
        self.initUI()
        self.mainLayout()
    def initUI(self):
        self.setGeometry(400, 400, 800, 600)
        self.setWindowTitle(" ")
    def initData(self):
        nums = 200
        data = np.random.random((nums,2))
        data = np.sort(data)
        x_data = data[:,0]
        y_data = data[:,1]
        (
            Scatter(init_opts=opts.InitOpts(width="1600px", height="1000px"))
                .add_xaxis(xaxis_data=x_data)
                .add_yaxis(
                series_name="",
                y_axis=y_data,
                symbol_size=20,
                label_opts=opts.LabelOpts(is_show=False),
            )
                .set_series_opts()
                .set_global_opts(
                xaxis_opts=opts.AxisOpts(
                    type_="value", splitline_opts=opts.SplitLineOpts(is_show=True)
                ),
                yaxis_opts=opts.AxisOpts(
                    type_="value",
                    axistick_opts=opts.AxisTickOpts(is_show=True),
                    splitline_opts=opts.SplitLineOpts(is_show=True),
                ),
                tooltip_opts=opts.TooltipOpts(is_show=False),
                toolbox_opts=opts.ToolboxOpts(
                    is_show=True,
                    orient="horizontal",
                    feature=opts.ToolBoxFeatureOpts(
                        save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(type_="jpeg", title="保存为jpeg", pixel_ratio=2),
                        restore=opts.ToolBoxFeatureRestoreOpts(),
                        data_zoom=opts.ToolBoxFeatureDataZoomOpts(
                            xaxis_index=[0],
                            yaxis_index=[0]
                        ),
                    )
                )
            )
                .render("/tmp/scatter.html")
        )
    def mainLayout(self):
        self.mainhboxLayout = QHBoxLayout(self)
        self.frame = QFrame(self)
        self.mainhboxLayout.addWidget(self.frame)
        self.hboxLayout = QHBoxLayout(self.frame)
        self.myHtml = QWebEngineView()
        # 打开本地html文件
        self.myHtml.load(QUrl("file:////tmp/scatter.html"))
        self.hboxLayout.addWidget(self.myHtml)
        self.setLayout(self.mainhboxLayout)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Stacked()
    ex.show()
    sys.exit(app.exec_())

打开界面效果如下图所示:

通过点击区域缩放的功能按钮,可以在图上选取一部分的区域进行更加细致的展示,并且具有单步返回和一步复原的功能按钮。选取一部分之后的展示效果如下图所示:

总结概要

本文通过一个实际的散点图案例,展示了如何使用pyqt5嵌套一个pyecharts图层的方法,通过这个技巧,可以在pyqt5的框架中也实现精美的数据可视化的功能模块。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/pyqtecharts.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

参考链接https://blog.csdn.net/weixin_38416696/article/details/94003119 “留一手”加剧内卷,“讲不清”浪费时间。

到此这篇关于在pyqt5中展示pyecharts生成的图像的文章就介绍到这了,更多相关pyqt5展示pyecharts生成的图像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyQt5实现将Matplotlib图像嵌入到Scoll Area中显示滚动条效果

    前言 如题目所述,又是花费了两天的时间实现了该功能,本来今天下午有些心灰意冷,打算放弃嵌入到Scoll Area中的想法,但最后还是心里一紧,仔细梳理了一下逻辑,最终实现了功能 效果展示 注意:当你想实现一个子功能的时候,可以从新创建两个文件: ×××.ui文件(如上图效果展示是和我项目里的位置一样的)×××.py文件(用来实现功能) 截图 如上图所示,红色框里的文件是实现效果展示的所有源文件.但是文件夹testcode是为了实现将Matplotlib图像嵌入到Scoll Area中所做的所有工

  • 在pyqt5中展示pyecharts生成的图像问题

    本文通过一个实际的散点图案例,展示了如何使用pyqt5嵌套一个pyecharts图层的方法,通过这个技巧,可以在pyqt5的框架中也实现精美的数据可视化的功能模块. 技术背景 虽然现在很少有人用python去做一些图形化的界面,但是不得不说我们在日常大部分的软件使用中都还是有可视化与交互这样的需求的.因此pyqt5作为一个主流的python的GUI框架地位是非常重要的,也是一个非常重要的技能.而pyecharts是相当于echarts的python版本,可以比较方便的制作一些非常精美的可视化图片

  • 在Django中Pyecharts生成图表实现

    1 因为pyecharts是支持python的一种可视化,但是想要将其放入网页中,主要有两种方法 (1)在网页中假如iframe,将网页嵌在iframe中(该方法不具体描述) (2)使用json传输到前端,对其进行展示 具体描述第2种方法如下: 假设用pyecharts画一张折线图 def line(): attr = ['教师', '教授', '副教授', '博导', '硕导', '国家级奖项', '省部级奖项', '院士', '荣誉学者', '专利'] v1 = [100, 20, 15,

  • matplotlib 生成的图像中无法显示中文字符的解决方法

    前几天使用matplotlib 绘图的时候发现无法使用中文字符,所以找了个笔记,顺便分享给大家 开发环境 windows 8.1 64bit python 3.6.0 matplotlib 3.2.1 问题背景 使用 matplotlib 绘制函数图像的时候,发现设置图像名称或图例需要汉字显示的时候只能得到空格 生成图像中的中文错误效果 原因分析 python中的matplotlib仅支持Unicode编码,默认是不显示中文的. 解决方案 解决方案1 python文件中添上一段语句 plt.rc

  • 利用 Flask 动态展示 Pyecharts 图表数据的几种方法

    本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀... Flask 模板渲染 1. 新建一个项目 flask-echarts 在编辑器中选择 New Project,然后选择 Flask,创建完之后,Pycharm 会帮我们把启动脚本和模板文件夹都建好 2. 拷贝 pyecharts 模板 将链接中的以下模板 ├── jupyter_lab.html ├── jupyter_notebook.h

  • Python GUI教程之在PyQt5中使用数据库的方法

    目录 PyQt5的SQL数据库支持 在PyQt5中简单使用数据库 创建一个UI界面 连接一个数据库 在UI界面查看和修改数据 添加和删除数据 在桌面图像化界面编程中,我们通常需要将一些数据或配置信息存储在本地.在本地进行数据的存储,我们可以直接使用文本文件,比如ini文件.csv文件.json文件等,或者是使用文件型的数据库(比如sqlit3)进行存储. PyQt5的SQL数据库支持 Qt平台对SQL编程有着良好的支持,PyQt5也一并继承了过来.在PyQt5中,QtSql子模块提供对SQL数据

  • PHP5中GD库生成图形验证码(有汉字)

    利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor 新建一个真彩色图像 imagecolorallocate 为一幅图像分配颜色(调色板) imagestring 绘制字符 imageline 绘制线条 imagesetpixel 打像素点 2.输出图片 imagejpeg($img); PHP实现过程,代码中注释详细,这里不做过多解释 verify.php 复制代码 代码如下: <?php //1.qi

  • java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决

    java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决 生成jpeg图像这是个非常非常简单的东西了,网上很多介绍是直接用com.sun.image.codec.jpeg.JPEGImageEncoder来实现,如下: /** * 将原图压缩生成jpeg格式的数据 * @param source * @return */ public static byte[] wirteJPEGBytes(BufferedImage source){ if(nu

  • 对PyQt5中树结构的实现方法详解

    树的实质是很多条数据按照一定的内在关系,分层级显示出来.因此每一条数据包括数据项和相互关系.数据项就对应了树中的column,而相互关系对应的是应该显示在哪一个条目下. PyQt5中,树的实现有两种形式,其中较为简单的是使用Tree Widget控件. 对于静态的数据,实现树结构可以直接在Qt中拖入一个Tree Widget控件,然后右键点击它,选择编辑. 其中column是每一条数据有几个数据项,Item体现的是数据和数据之间是什么关系. 对于我们需要从数据库中查出来的数据,我么需要根据实际的

  • 使用pyecharts生成Echarts网页的实例

    pyecharts是一个封装百度开源图表库echarts的包,使用pyecharts可以生成独立的网页,也可以在flask.django中集成使用. 示例如下: from pyecharts import Bar attr = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", &quo

  • IntelliJ IDEA中代码一键生成方法

    之前有不少小伙伴问松哥微人事项目(https://github.com/lenve/vhr) 使用的 MyBatis 逆向工程在哪里?其实旧版微人事当时没有使用逆向工程,是我自己手动敲出来的,当然手动敲的工作量非常大. 今年发出来的新版微人事,我使用了逆向工程自动生成实体类和 dao 层的代码.MyBatis 的逆向工程要么需要添加依赖,要么需要自己去网上下载 jar,用起来还是有点麻烦,所以,今天和小伙伴们介绍一款 IntelliJ IDEA 上的免费开源插件,叫做 EasyCode,可以方便

随机推荐