在python中用QCustomPlot实现多y轴多曲线

91 篇文章 6 订阅
59 篇文章 2 订阅

昨天发现了一个新的绘图库,感觉也很强大,原生支持的图表种类就非常多,而且性能也不输pyqtgraph,因为之前我用pyqtgraph模仿Canape的功能实现了多轴多线,找到一个新的绘图库,就想用这个试试,但是因为这个库在python领域应用真的很少,多数用在c++环境,我搜到的99%资料都是c++的,不过好在python封装的几乎和c++一致,所以看c++文档也还行,但是即使这样,开始还是出现了问题,多个曲线用多个y轴时,第二条线就不显示了,最后找到一篇博客,发现了问题所在,是因为新的轴没有设置数值范围,这个的确不如pyqtgraph,因为pyqtgraph是自动关联的,而且会根据绘图数据自动调整坐标范围。


import PyQt5
import sys
from PyQt5.QtWidgets import QApplication
import QCustomPlot2
from QCustomPlot2 import QCustomPlot,QCP,QCPAxisRect,QCPAxis
import numpy as np
import pandas as pd

from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QGridLayout,QTabWidget,
                             QHBoxLayout, QVBoxLayout,QLabel, QComboBox,QPushButton,
                             QDateEdit, QSpacerItem,QFrame, QSizePolicy, QSplitter,
                             QRadioButton, QGroupBox,QCheckBox,QLineEdit, QAction,
                             QFileDialog,QListView,QListWidget,QListWidgetItem,QMenu,
                             QProgressBar,QProgressDialog,QMessageBox,QAbstractItemView,
                             QSplashScreen)
from PyQt5.QtCore import Qt, QDate, QRect,QSize
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon, QBitmap, QPainter, QPixmap, QCursor, QMovie,QPen
from asammdf import MDF

class MainWindow(QMainWindow):

    def __init__(self,*args):
        
        super().__init__()
        self.mdf = MDF(r"C:\Users\master01\Desktop\下载\AnalysisTools\A样耐久稳态工况_3th cycle_2022-06-24 11-05-13.MDF")
        self.a = self.mdf.get('sFCS_iAvailable_A').samples
        self.b = self.mdf.get('sCTE12_StkIn_tClt_dC').samples
        self._init_ui()
        self.show()


    

    def _init_ui(self):
        self.setWindowTitle('QCustomPlot')
        self.resize(1200,700)
        self.line_plot = QCustomPlot()


        self.line_plot.plotLayout().clear()
        self.qcp_rect = QCPAxisRect(self.line_plot,True)
        print(self.qcp_rect)
        self.line_plot.plotLayout().addElement(0,0,self.qcp_rect)
        self.new_axis = self.qcp_rect.addAxis(QCPAxis.atLeft)
        self.x_axis = self.qcp_rect.axis(QCPAxis.atBottom)
        self.y_axis = self.qcp_rect.axis(QCPAxis.atLeft,0)
        self.graph1 = self.line_plot.addGraph(self.x_axis,self.y_axis)
        self.graph2 = self.line_plot.addGraph(self.x_axis,self.new_axis)

        x = list(range(len(self.a)))
        y = self.a
        y1 = self.b
        #self.line_plot.xAxis.rangeChanged.connect(setRange())
        self.graph1.setData(x,y)
        self.graph1.setPen(QPen(Qt.red))
        self.graph1.rescaleAxes(True)
        layer1 = self.graph1.layer()
        print(layer1.index())


        #graph1.setVisible(False)
        #self.y_axis.setVisible(False)

        self.graph2.setData(x,y1)
        self.graph2.setPen(QPen(Qt.blue))
        self.graph2.setVisible(True)
        #不加下面这句,图就显示不出来
        self.graph2.valueAxis().setRange(0, 100)
        layer2 = self.graph2.layer()
        print(layer2.index())
        print(self.graph2.dataCount())
        #print(dir(self.line_plot))
        print("====================================================")
        print(dir(QCP))
        self.line_plot.setInteraction(QCP.iRangeDrag)
        self.line_plot.setInteraction(QCP.iRangeZoom )
        self.line_plot.setInteraction(QCP.iSelectPlottables)
        #self.line_plot.show()
        self.setCentralWidget(self.line_plot)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainWindow()
    sys.exit(app.exec_())

这中间遇到另一个问题,绘图不更,我正在使用QSplitter,其右侧窗格为QCustomPlot,当我点击左侧窗格(树状视图)时会显示图表。问题是图表在我调整分割器大小之前没有显示或更新。

应该使用replot()函数更新绘图:

customPlot->replot();

它会导致完整的重新插入内部缓冲区。当您对图形的轴范围或数据点进行更改时,必须调用此方法,这使得更改可见。

另外一个比较坑的问题是在导入QCustomPlot模块前必须先导入PyQt5,否则会报错,这个是从其它博客上看到的,感觉挺坑的,而且这种问题一般不好排查,所以在此记录一下

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羸弱的穷酸书生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值