首页 > 其他分享 >pyqt 实现双y轴曲线显示

pyqt 实现双y轴曲线显示

时间:2022-12-10 15:34:35浏览次数:55  
标签:index 实现 combox1 self 曲线 pyqt str data combox2

使用pyqt 显示控件实现曲线的绘制

代码中brain_node_disk_session 为我项目中需要显示的数据源,自行替换。

 

class XchartView(QWidget):
    def __init__(self,brain_node_disk_session):
        super(XchartView, self).__init__()
        self.brain_node_disk_session = brain_node_disk_session
        main_layout =QVBoxLayout()
        comb_box    =QHBoxLayout()
        self.combox1 = QComboBox()
        self.combox2 = QComboBox()
        self.combox1.addItems(utils_ui_list_sig)
        self.combox2.addItems(utils_ui_list_sig)
        self.combox1.setStyleSheet("QWidget{color:red}")#color
        self.combox2.setStyleSheet("QWidget{color:green}")

        comb_box.addWidget(self.combox1)
        comb_box.addWidget(self.combox2)
        self.win_charts_sensor = pyqtgraph.GraphicsLayoutWidget(show=True)
        self.label = pyqtgraph.LabelItem(justify='right')
        self.win_charts_sensor.addItem(self.label)
        self.win_charts_sensor.nextRow()
        # self.win_charts_sensor = pyqtgraph.PlotWidget()
        self.p1 = self.win_charts_sensor.addPlot()#(title="value")

        # self.p1 = self.win_charts_sensor.plotItem
        #self.p1.setLabels(left='axis 1')
        self.p2 = pyqtgraph.ViewBox()
        self.p1.showAxis('right')
        self.p1.scene().addItem(self.p2)
        self.p1.getAxis('right').linkToView(self.p2)
        self.p2.setXLink(self.p1)
        #self.p1.getAxis('right').setLabel('axis2', color='#0000ff')


        # self.label.setGeometry(QRectF(0, 0, 100, 100))
        self.vLine = pyqtgraph.InfiniteLine(angle=90, movable=False)
        self.hLine = pyqtgraph.InfiniteLine(angle=0, movable=False)
        #self.curpose_Line = pyqtgraph.InfiniteLine(angle=90, movable=False)#current slide position
        self.p1.addItem(self.vLine, ignoreBounds=True)
        self.p1.addItem(self.hLine, ignoreBounds=True)
        #self.p1.addItem(self.curpose_Line, ignoreBounds=True)
        self.vb = self.p1.vb

        main_layout.addLayout(comb_box)
        main_layout.addWidget(self.win_charts_sensor)
        main_layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(main_layout)

        self.combox1_data = []
        self.combox2_data = []

        self.curve1 = self.p1.plot(self.combox1_data, pen="r")
        self.p2.addItem(pyqtgraph.PlotCurveItem(self.combox2_data, pen='g'))

        self.combox1.currentIndexChanged[int].connect(self.update_comb1)
        self.combox2.currentIndexChanged[int].connect(self.update_comb2)

        self.ts = 0

        self.timer_init()

        self.index1_choose = None
        self.index2_choose = None

    def timer_init(self):
        #使用QTimer,2秒触发一次,更新数据
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.drawLine)
        self.timer.start(200)

    def drawLine(self):
        # print("self.index1_choose,self.index2_choose:",self.index1_choose,self.index2_choose)
        if self.index1_choose != None and self.index2_choose != None:
            self.combox1_data = np.array(self.get_val_from_str(utils_ui_list_sig[self.index1_choose]))
            self.combox2_data = np.array(self.get_val_from_str(utils_ui_list_sig[self.index2_choose]))
        elif self.index1_choose == None and self.index2_choose != None:
            self.combox1_data = []
            self.combox2_data = np.array(self.get_val_from_str(utils_ui_list_sig[self.index2_choose]))
        elif self.index1_choose != None and self.index2_choose == None:
            self.combox1_data = np.array(self.get_val_from_str(utils_ui_list_sig[self.index1_choose]))
            self.combox2_data = []
        else:
            self.combox1_data = []
            self.combox2_data = []

        # print("self.combox1_data's length:",len(self.combox1_data))
        self.curve1.setData(self.combox1_data)
        self.p2.addItem(pyqtgraph.PlotCurveItem(self.combox2_data, pen='g'))

    def update_comb1(self, index):
        self.index1_choose = index
        self.combox1_data = []
        self.curve1.setData(self.combox1_data)
        self.combox1_data = np.array(self.get_val_from_str(utils_ui_list_sig[index]))
        if np.any(self.combox1_data) :
            self.curve1.setData(self.combox1_data)
        else:
            print("self.combox2_data is null")
        self.proxy = pyqtgraph.SignalProxy(self.p1.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)

    def update_comb2(self, index):
        self.index2_choose = index
        self.p2.setGeometry(self.p1.vb.sceneBoundingRect())
        self.p2.linkedViewChanged(self.p1.vb, self.p2.XAxis)
        self.combox2_data = []
        self.p2.clear()
        self.combox2_data = np.array(self.get_val_from_str(utils_ui_list_sig[index]))
        # self.curve2 = self.plot_view_v1.plot(self.combox2_data, pen="g")
        if np.any(self.combox2_data):
            self.p2.addItem(pyqtgraph.PlotCurveItem(self.combox2_data, pen='g'))
        else:
            print("self.combox2_data is null")
        self.proxy = pyqtgraph.SignalProxy(self.p1.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)

    def mouseMoved(self,evt):
        pos = evt[0]  ## using signal proxy turns original arguments into a tuple
        if self.p1.sceneBoundingRect().contains(pos):
            mousePoint = self.vb.mapSceneToView(pos)
            mouse_index = int(mousePoint.x())
            combox1_data_str, combox2_data_str = self.get_cur_combox_value(mouse_index)
            try:
                self.ts = self.brain_node_disk_session.data_lidar.timestamps[mouse_index]/1000
            except:
                self.ts = self.brain_node_disk_session.data_lidar.timestamps[-1] / 1000
            # print("ts:",self.ts)
            self.label.setText(
                "<span style='font-size: 10pt'>ts=%s,   <span style='font-size: 10pt'>x=%0.3f,   <span style='color: red'>y1=%s</span>,   <span style='color: green'>y2=%s</span>" % (
                    time_convert(self.ts), mouse_index, combox1_data_str, combox2_data_str))

            self.vLine.setPos(mousePoint.x())
            self.hLine.setPos(mousePoint.y())

    def set_p(self,pos_index):
        mouse_index = pos_index
        self.vLine.setPos(pos_index)
        combox1_data_str, combox2_data_str=self.get_cur_combox_value(mouse_index)
        self.ts = self.brain_node_disk_session.data_imu.timestamps[pos_index]/1000
        self.label.setText(
            "<span style='font-size: 10pt'>ts=%s,   <span style='font-size: 10pt'>x=%0.3f,   <span style='color: red'>y1=%s</span>,   <span style='color: green'>y2=%s</span>" % (
                time_convert(self.ts),mouse_index, combox1_data_str, combox2_data_str))

    def get_cur_combox_value(self,mouse_index):
        len_comb1 = len(self.combox1_data)
        len_comb2 = len(self.combox2_data)
        if len_comb1 > 0 and mouse_index > 0 and mouse_index < len_comb1:
            combox1_data_str = '{:.3f}'.format(self.combox1_data[mouse_index])
        else:
            combox1_data_str = '_'
        if len_comb2 > 0 and mouse_index > 0 and mouse_index < len_comb2:
            combox2_data_str = '{:.3f}'.format(self.combox2_data[mouse_index])
        else:
            combox2_data_str = '_'
        return combox1_data_str,combox2_data_str

    def set_y_range(self, up, down):
        self.p1.setRange(yRange=(down,up))

 

  

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:index,实现,combox1,self,曲线,pyqt,str,data,combox2
From: https://www.cnblogs.com/E-Dreamer-Blogs/p/16971632.html

相关文章