zoukankan      html  css  js  c++  java
  • PyQt5数据可视化

    1、下载PyQtGraph模块

    Windows上下载:

    pip install pyqtgraph

    Linux上下载:

    pip3 install pyqtgraph 

    MacOS上下载:

    pip3 install pyqtgraph

    下载完毕后我们可以运行以下代码:

    import pyqtgraph.examples
    pyqtgraph.examples.run()

     2、基础知识与参数设置

    参数 类型 默认值 解释
    leftButtonPan bool True 值为True的话,可以用鼠标左键来上下左右拖动图表;若为False,拖动鼠标左键会形成一个矩形框,视图镜头会随之深入
    foreground 参考 mkColor() ‘d’ 设置前景颜色(包括文本、线条、坐标轴等),'d'为灰色
    background 参考 mkColor() ‘k’ 设置背景颜色,'k'为黑色
    antialias bool False 是否启用抗锯齿(可以让曲线更加光滑)
    useOpenGL bool False 是否在视图中启用OpenGL
    crashWarning bool False 则会打印针对可能导致程序崩溃情况的警告
    PyQtGraph提供了两种类似的方法来进行全局设置:

    pyqtgraph.setConfigOptions(**opts) # 同时设置多项参数
    pyqtgraph.getConfigOption(opt) # 只设置一项参数
    我们可以这么使用:

    # 禁止拖动图表,并启用抗锯齿
    pyqtgraph.setConfigOptions(leftButtonPan=False, antialias=True)

    # 禁止拖动图表
    pyqtgraph.getConfigOption('leftButtonPan', True)
     

    pyqtgraph.plot()和PlotWidget.plot()

    以上两个方法都是用来绘图的,区别如下:

    pyqtgraph.plot() 在一个新窗口中绘制数据(窗口中包含一个plotWidget)
    PlotWidget.plot() 在plotWidget控件中绘制数据
    可见,如果要将PyQtGraph嵌入PyQt5窗口中的话(也就是将控件添加到窗口中),应该使用PlotWidget.plot()。

    plot()方法的基本参数如下:

    x - X轴数据(可选)。如果没有赋值的话,程序则自动生成特定范围的整数值
    y - Y轴数据
    pen - 图表线条的画笔参数,若设为None则不显示线条
    symbol - 参数为字符串类型,用于描述图表每个坐标点的形状。比如设为'o',则坐标点的形状就为o。可选值总共有这么几种:'o', 's', 't', 't1', 't2', 't3','d', '+', 'x', 'p', 'h', 'star'
    symbolPen - 描绘符号轮廓的画笔参数
    symbolBrush - 填充符号的画刷参数
    fillLevel - 用于计算曲线下面积的Y坐标值
    brush - 用于填充曲线下面积的画刷
    示例代码:

    # 指定y坐标轴上的值,线条画笔为红色,坐标点符号为'o'
    PlotWidget.plot([1, 2, 3, 4, 5], pen='r', symbol='o')
    运行截图(可以看到x轴坐标是自动生成的):

    颜色,画笔和画刷

    PyQt5提供了QColor,QPen和QBrush类用于描绘线条与填充颜色,而在PyQtGraph中,我们可以使用mkColor(),mkPen()以及mkBrush()方法来实例化相应的对象。

    第一行中的单个字符串所对应的值如下:

    'b': QtGui.QColor(0,0,255,255)
    'g': QtGui.QColor(0,255,0,255)
    'r': QtGui.QColor(255,0,0,255)
    'c': QtGui.QColor(0,255,255,255)
    'm': QtGui.QColor(255,0,255,255)
    'y': QtGui.QColor(255,255,0,255)
    'k': QtGui.QColor(0,0,0,255)
    'w': QtGui.QColor(255,255,255,255)
    'd': QtGui.QColor(150,150,150,255)
    'l': QtGui.QColor(200,200,200,255)
    's': QtGui.QColor(100,100,150,255)
    颜色对象主要用于画笔和画刷,而这两者的设置非常简单:

    mkPen('r')
    mkPen(255, 255, 255)
    mkPen((255, 255, 255, 255))
    mkPen('#0000FF')
    mkPen(QColor)
    准确来说,能被mkColor()接受的参数都能用在mkPen()中。除了颜色我们还可以设置画笔粗细:

    mkPen(color='r', width=2)
    mkPen({'color': '#0000FF', 2})
    如果不想设置画笔,我们可以传入None:

    mkPen(None)
    画刷设置同理,可以接受所有能被mkColor()接受的参数。可传入None不设置画刷。

    3、实现实例说明:

    #使用PyQtGraph来进行数据可视化应用

    import sys
    import random
    import numpy as np
    import pyqtgraph as pg
    from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout


    class Demo(QWidget):
    def __init__(self):
    super(Demo, self).__init__()
    self.resize(1000, 1000)

    # 1
    pg.setConfigOptions(leftButtonPan=False)
    pg.setConfigOption('background', 'w')
    pg.setConfigOption('foreground', 'k')

    # 2
    x = np.arange(100)
    y = np.random.normal(size=100)
    r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3', 'd', '+', 'x', 'p', 'h', 'star'])
    r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])

    # 3
    self.pw1= pg.PlotWidget(title="绘制多条线")
    #self.plot_data = self.pw.plot(x, y, pen=None, symbol=r_symbol, symbolBrush=r_color)
    self.pw2 = pg.PlotWidget(title="绘制条状图")
    self.pw3 = pg.PlotWidget(title="绘制网格线")
    # 4
    self.plot_btn = QPushButton('Replot', self)
    self.plot_btn.clicked.connect(self.plot_slot)
    self.plot_btn.clicked.connect(self.draw1)
    self.plot_btn.clicked.connect(self.draw2)
    self.v_layout = QVBoxLayout()
    self.v_layout.addWidget(self.pw1)
    self.v_layout.addWidget(self.pw2)
    self.v_layout.addWidget(self.pw3)
    self.v_layout.addWidget(self.plot_btn)
    self.setLayout(self.v_layout)

    def plot_slot(self):
    x = np.arange(100)
    y = np.random.normal(size=100)
    r_symbol = random.choice(['o', 's', 't', 't1', 't2', 't3', 'd', '+', 'x', 'p', 'h', 'star'])
    r_color = random.choice(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'd', 'l', 's'])
    self.pw1.plot(x, y, pen=pg.mkPen(color="r",width=5),symbol=r_symbol, symbolBrush=r_color) #如果不设后面参数则显示点的形状为正常点
    self.pw1.plot(x, y+2, pen=(0,0,255),symbol=r_symbol, symbolBrush=r_color)
    def draw1(self):
    x=np.arange(10)
    y1=x+1
    y2=1.1*np.cos(x+0.33)
    b1=pg.BarGraphItem(x=x,height=y1,width=0.3,brush="r")
    b2=pg.BarGraphItem(x=x,height=y2,width=0.3,brush="g")
    self.pw2.addItem(b1)
    self.pw2.addItem(b2)
    def draw2(self):
    x=np.cos(np.linspace(0,2*np.pi,1000))
    y=np.sin(np.linspace(0,4*np.pi,1000))
    self.pw3.plot(x,y,pen=pg.mkPen(color="d",width=2))
    self.pw3.showGrid(x=True,y=True) #显示网格

    if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

    
    


    4、图像导出说明

    如果想要导出图像的话,我们可以点击右键,选择export,之后就会出现一个导出选项框:

    我们可以选择导出为图片、SVG文件、CSV文件或者重新在Matplotlib中进行绘制。选择导出格式后,我们可以在Export options框中进行相应的设置(笔者这里就直接选择导出为png格式的图片了),设置好后点击Export按钮则会出现一个文件保存对话框:

    点击Save按钮保存图片,此时可能会出现以下报错:

     

    报错显示在ImageExporter.py文件中的第70行,我们根据报错内容直接将改行代码修改如下(将float类型转换为int类型):

    bg = np.empty((int(self.params['width']), int(self.params['height']), 4), dtype=np.ubyte)
    现在已经可以成功导出

    ------------恢复内容结束------------

    ------------恢复内容结束------------

  • 相关阅读:
    详述Xgboost原理
    Uncaught Error: Script error for "popper.js", needed by: bootstrap
    JS 正则表达式从地址中提取省市县
    OneThink实现多图片批量上传功能
    移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传
    PHPCMS V9添加模板自定义全局变量
    CentOS 7:如何安装防火墙?
    HTML5的fieldset标签
    PHP使用CURL详解
    asp.net+swfupload 多图片批量上传(附源码下载)
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/12323364.html
Copyright © 2011-2022 走看看