专栏首页Python机器学习算法说书人遗传算法可视化项目(6):用PyQt5实现数据可视化

遗传算法可视化项目(6):用PyQt5实现数据可视化

昨天讲了一下Python和C语言交互,没有看昨天或者之前的文章点一下历史消息或者这里:

遗传算法可视化项目(1):概述

遗传算法可视化项目(2):获取信息

遗传算法可视化项目(3):创建图的数据结构

遗传算法可视化项目(插曲):关于距离的计算

遗传算法可视化项目(4):遗传算法

遗传算法可视化项目(5):C语言和Python交互

今天来讲一下用PyQt5实现数据可视化,首先把之前的文本文件(海南省所有镇的经纬度.txt),复制一份放在和昨天那个pyd文件同目录,接着就是新建一个Python文件,我用anaconda新建,因为我用的是anaconda,本身就自带PyQt5,不需要额外安装,既然用的是anaconda,之前我用过里面的Anaconda Prompt,这次还是依旧找到Anaconda Prompt,附近应该有一个Spyder,点击打开,然后点击左上角的File→new File,然后点击File→Save as,改个名字(我这里就叫main.py了)存放到和之前库文件(pyd文件)同目录,然后就是编写main.py了,首先导入开发包,代码如下:

core库是我昨天弄的,因为我要数据可视化,必须把点和边画上去,就简单的画一个点太小了(点就一个像素),所以我用小正方形(4*4像素)代替点,因为我是要用PyQt5画点和线,我首先就是想到了QWidget类里面有一个PaintEvent方法就是控制画图事件的,因此我只要自定义一个类(名字随便,我这里就叫Window了)继承QWidget然后重写里面的PaintEvent方法就行,Window类和构造方法代码如下:

注意一下 __init__是开头两个下划线,结尾两个下划线,self和C++,Java,C#的this差不多(为了规范还是建议使用self,全部换成this也可以运行,但不能一会this一会self!),super().__init__()表示调用父类(QWidget)的构造方法,init_ui方法是用来生成一个窗口的,具体实现代码如下:

setGeometry实际上是父类方法,当然子类也能用,这个方法总共有四个参数,前两个参数表示窗口左上角位置(屏幕左上角x=0,y=0,向右是x轴正方向,向下是y轴正方向,在这里x=50,y=50),后两个表示窗口大小,我这里窗口大小就是900*900了,弄太大屏幕放不下。然后就是第二个父类方法setWindowTitle,就一个参数,参数类型是字符串,这个函数就是给你的窗口起个名字的,我这里就叫“数据可视化”了,这里名字可以随便叫。然后就是最后一个父类方法show了,意思就是用来显示到屏幕的,也没什么好讲的。

接下来就是重写父类QWidget的PaintEvent方法了,代码如下:

虽然参数e没有用到,但不能不写,不写的话就不是重写了,而是子类自己的方法了,然后就是使用QPainter类的构造方法构造一个qp的变量,用来监视绘画事件,然后就是开始,画点,画线,结束,画点方法的代码如下:

因为这里参数没有self(用不到self),所以我这里就把这个方法定义成一个静态方法,setPen是用来设置画笔颜色粗细啥的,这里我就设置成红色了,当然其他颜色也可以,然后就是一个for循环,获取点的数据然后画上去,getPoint这个函数我昨天讲过了,今天就不讲了,重点是最后一个drawRect方法,四个参数,前两个表示矩形左上角的位置,后两个表示矩形的大小,我在这里宽和高都是4,所以画出来是一个4*4的小正方形。

接着就是画线,具体实现代码如下:

首先使用QPen类的构造方法构造一支笔(构造了如要使用必须让qp监视器知道才行,后面的setPen方法就是用来告诉监视器的),这个构造方法我传入了三个参数,第一个参数:画笔颜色,第二个参数:粗细程度,第三个参数:线的种类,这里是实线,接着就是for循环遍历图这个数据结构了,如果边可达就用drawLine画上线,drawLine方法有四个参数,前两个是表示第一个点的x和y的坐标值,后两个是第二个点的x和y的坐标值,我为了让线的端点是之前画的小正方形正中心,我就把原来端点的坐标往右偏移了两个像素,往下偏移了两个像素,之前的小正方形是四个像素。

最后是主函数,代码如下:

首先开始计时start,然后就是初始化图这个数据结构,然后就是使用QApplication类的构造方法创建一个应用对象app,接着就是构造之前的Window的对象,然后结束计时end,end-start表示时间差(也就是用来看程序运行需要多长时间),最后不要忘了写退出函数!

接着就是运行了,按F5快捷键即可,当然也可以在左上角找到并点击Run→Run也可以,最终运行出来应该是这样:

左边是我的程序结果(也就是一个窗口),右边是控制台输出的东西,也就是时间(单位s),虽然运行出来了,但一旦关闭窗口控制台会报错,报错如下:

出现问题是可能因为ipython console对PyQt5不怎么友好,所以我们必须使用Python console,可是我的sypder版本太新,已经没有Python console了,但是不要急,我还是能够让它没有问题,打开Anaconda Prompt,切换到main.py的目录,然后什么东西都不要输,直接输入命令python main.py回车即可!我就给大家看一下Anaconda Prompt命令行运行关闭窗口之后是否还像刚才那样出现问题,命令行Anaconda Prompt运行结果看一下这里(这里只给大家看一下关闭窗口控制台上有没有像刚才那样出问题):

虽然问题已经解决了,但还是太麻烦了,毕竟运行一下明明是快捷键和鼠标点几下的事却要输入命令,确实有点麻烦!最后我不得不使用pycharm来运行这个程序了。

如果安装好了pycharm的话就在桌面上找到pycharm的图标,双击打开,如果是第一次安装将就一直默认点下去,当然要设置字体字号背景颜色啥的我也没话说,实在不会设置只能将就默认了,直到出现这个:

点击create new project,然后弹出一个这样的窗口:

选择下面的Existing interpreter,然后点击Interpreter右边的三个点,出来这个:

点击System Interpreter,然后点击那三个点,然后就是找到anaconda安装目录里面的python.exe文件,选中那个文件,点击OK就行了,然后再点OK,最后点击create等待片刻就好,然后就是点击左上角的file→open,找到之前编写的main.py打开,接着找到这里:

鼠标点击那个绿绿的(一提到绿绿的就想起了原谅帽

)类似于播放的按钮,然后点击Run main就可以运行了,还是像刚刚那样给大家看一下控制台,运行结束关闭窗口后控制台如下:

本文分享自微信公众号 - Python机器学习算法说书人(Python-ML-Algorithm),作者:小陈学Python

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 遗传算法可视化项目(7):地图装饰

    前天讲了用PyQt5实现数据可视化,也已经基本讲完整个项目了,没有看之前文章或者今天才关注的可以看一下历史消息或者点击这里:

    不可言诉的深渊
  • 遗传算法可视化项目(插曲):关于距离的计算

    今天暂时先不讲遗传算法,我要解决的是TSP问题,具体什么TSP问题之前文章里讲过了,大家可以点一下历史消息或者这里:

    不可言诉的深渊
  • Python 模块:itertools

    在某些情况下,我们通常需要对序列进行一些复杂的操作,比如从序列中选出一部分元素做排列,组合,笛卡尔积等。如果自己实现这个操作未免太繁琐了,而且还会占用大量的空间...

    不可言诉的深渊
  • ASP.NET Core分布式项目实战(业务介绍,架构设计,oAuth2,IdentityServer4)--学习笔记

    https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

    郑子铭
  • 1166-敌兵布阵

    描述:C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tid...

    用户2038589
  • Cypress系列(57)- 删除等待代码

    https://www.cnblogs.com/poloyy/category/1768839.html

    小菠萝测试笔记
  • ElasticSearch5.0之后的改变

    老梁
  • Android四大组件之Service

    Android四大组件之Service 服务的两种开启方式: startService();开启服务. 开启服务后 服务就会长期的后台运行,即使调用者退出了....

    xiangzhihong
  • 如何让搜索引擎抓取AJAX内容?

    越来越多的网站,开始采用"单页面结构"(Single-page application)。 整个网站只有一张网页,采用Ajax技术,根据用户的输入,加载不同的内...

    ruanyf
  • 【Flutter 专题】79 图解 Android Native 集成 FlutterBoost 小尝试 (二)

    和尚前几天刚尝试接入 FlutterBoost,主要对其页面路由的跳转及传参等有了初步的认识,接下来是对日常操作的基本学习;

    阿策小和尚

扫码关注云+社区

领取腾讯云代金券