在pyqt5中展示pyecharts生成的图像问题
作者:DECHIN 发布时间:2023-10-17 10:59:46
本文通过一个实际的散点图案例,展示了如何使用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 “留一手”加剧内卷,“讲不清”浪费时间。
来源:https://www.cnblogs.com/dechinphy/p/pyqtecharts.html
猜你喜欢
- 设计模式:迭代迭代是一种设计模式,解决有序便利序列的问题。通用的可迭代对象需要支持done和next方法。伪代码如下:while not i
- 因为评论有很多人说爬取不到,我强调几点kv的格式应该是这样的:kv = {‘cookie':‘你复制的一长串cookie',
- XML(可扩展标记语言)已成为Web应用中数据表示和数据交换的标准,随着Internet的快速发展,尤其是电子商务,Web服务等应用的广泛使
- PHP count_chars() 函数实例返回一个字符串,包含所有在 "Hello World!" 中使用过的不同字符
- 基本信息程序包名称:基于.net开发的遵循web标准的个人站点程序包下载开发者主页:www.ceocio.net软件大小:1.84mb安装环
- 主页上的鼠标是不是就只有箭头和小手两种模样呢?如果鼠标移到“帮助”等字样上时,形状就变成求助的问号;鼠标移到可能需要较长时间等待的超链接时,
- 今天写了一个获取当前公网ip并且自动断开宽带连接的文件,和大家分享下。这个文件的具体用途大家懂的,可以尽管拿去用,不过目前只适用于Windo
- 这几天一直困惑我的问题,我觉得pycharm应该也是有的啊,偶然间找到了这个。把那个框里的选中,就可以了。ps:我的是 PyCharm 20
- sign签名是用于提供给外部(第三方)调用的接口,调用方需要提供正确的appkey钥匙才能调用,确保了接口的安全性。签名参数sign生成方法
- 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字
- 代码如下:'============================== '格式化HTML,SDCMS加强版 '==
- 一:绑定方法:其特点是调用方本身自动作为第一个参数传入1.绑定到对象的方法:调用方是一个对象,该对象自动传入2.方法绑定到类:调用方是类,类
- 前言在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引
- python第三方库的安装PyInstaller库PyInstaller库能够在不同操作系统下将python源文件打包,变成直接可运行的可执
- 引言:在微信小程序里,比如商品展示页面的商品详情会有图片展示,PC端设置的商品详情是PC端的宽度,所以在小程序里图片会显示不全,这时就应该做
- 一、yaml文件介绍yaml是一个专门用来写配置文件的语言。1. yaml文件规则区分大小写;使用缩进表示层级关系;使用空格键缩进,而非Ta
- 首先确定你要爬取的目标网站的表单提交方式,可以通过开发者工具看到。这里推荐使用chrome。这里我用163邮箱为例打开工具后再Network
- 环境系统:win10cpu:i7-6700HQgpu:gtx965mpython : 3.6pytorch :0.3数据下载来源自Sasan
- # -*-coding:utf8 -*- ''' Python常见文件操作示例 os.path 模块中的路径名访问函
- 如图,这次需要在图片中找到卷尺的红色刻度,所以需要对图像做过滤,只留下红色部分。一开始的想法是分别找到RGB值,然后找到红色区域的部分保留就