PyQt5折线图鼠标悬停显示坐标实现

import datetime
import sys

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QCursor, QColor, QBrush
from PyQt5.QtWidgets import QToolTip
from PyQt5.QtChart import *

class View_event(QtWidgets.QWidget):
    # view 总窗口
    def __init__(self):
        super(View_event, self).__init__()
        # self.setupUi(self)

        # 执行折线视图函数
        self.create_chart()

    def create_chart(self):
        # 创建折线视图窗口

        chart = QChartView(self)
        chart.setGeometry(QtCore.QRect(20, 100, 980, 380))
        chart.setRenderHint(QPainter.Antialiasing)  # 抗锯齿
        chart.raise_()

        chart._chart = QChart(title="折线图堆叠")  # 创建折线视图
        # chart._chart.setBackgroundVisible(visible=False)      # 背景色透明
        chart._chart.setBackgroundBrush(QBrush(QColor("#FFFFFF")))     # 改变图背景色

        #  图形项默认无法接收悬停事件,可以使用QGraphicsItem的setAcceptHoverEvents()函数使图形项可以接收悬停事件。
        chart._chart.setAcceptHoverEvents(True)
        # 4条折线的坐标值

        dataTable = [
            # 这里是y值对应13个x轴
            ["PTSA",130, 182, 120, 154, 109, 170, 110,150, 132, 141, 114, 100, 160],
            ["pH", 120, 154, 109,132, 160,110, 130, 141, 194, 170,110, 182,110],
            ["ORP",109,132,174,130,  120,150, 110, 170,  120,164,  132, 141,  160],
            ["Conductivity", 160, 109, 154, 130,182, 132, 141, 160,150,170, 180,164,120]
        ]
        # 执行创建折线的函数
        self.create_series(dataTable,chart)
        chart._chart.createDefaultAxes()  # 创建默认的轴

        chart._chart.axisY().setTickCount(11)  # y1轴设置10个刻度
        chart._chart.axisY().setLabelFormat("%d")
        chart._chart.axisY().setRange(100, 200)  # 设置y1轴范围

        # 定义多个y轴
        y2_Aix = QValueAxis()  # 定义y2轴
        y2_Aix.setLabelFormat("%d")
        y2_Aix.setRange(250, 360)
        y2_Aix.setTickCount(11)
        chart._chart.addAxis(y2_Aix, Qt.AlignLeft)  # 添加到左侧


        y3_Aix = QValueAxis()  # 定义y3轴
        y3_Aix.setLabelFormat("%d")
        y3_Aix.setRange(0, 110)
        y3_Aix.setTickCount(11)
        chart._chart.addAxis(y3_Aix, Qt.AlignRight)  # 添加到右侧

        y4_Aix = QValueAxis()  # 定义y4轴
        y4_Aix.setLabelFormat("%d")
        y4_Aix.setRange(3870, 3980)
        y4_Aix.setTickCount(11)
        chart._chart.addAxis(y4_Aix, Qt.AlignRight)  # 添加到右侧


        chart._chart.axisX().setTickCount(11)  # X轴设置10个刻度
        # 执行定义X轴的函数
        self.customAxisX(chart._chart)

        chart.setChart(chart._chart)

    def create_series(self,dataTable,chart):
        # 创建折线的函数
        for i, data_list in enumerate(dataTable):  # [index,[list]]
            # 创建曲线
            series = QLineSeries(chart._chart)
            # 设置折线名
            series.setName(data_list[0])

            for j, v in enumerate(data_list[1:]):
                #  添加折线和对应的坐标点
                series.append(j, v)

            series.setPointsVisible(True)  # 显示原点
            # 鼠标悬停连接事件
            series.hovered.connect(self.onSeriesHoverd)
            chart._chart.addSeries(series)  # 添加折线到视图窗口
        return chart._chart


    def customAxisX(self,chart):
        # 自定义x轴(均分)
        chart = chart
        series = chart.series()
        if not series:
            return
        # 获取当前时间前8小时的一小时内的时间
        time =[]
        for index in range(13):
            num = 60/13
            last_day = (datetime.datetime.now() + datetime.timedelta(hours=-8,minutes=- index*num)).strftime(
                "%H:%M")
            time.append(last_day)
        category=list(reversed(time))

        '''QValueAxis是轴的范围什么的不需要自己指定,轴上显示的label(也就是0,1,2,3这些内容)是默认的。qt会根据你轴上的点自动设置。若你需要自定义一些内容,QCategoryAxis是比较好的,但是需要自己自定义好才可以调用。'''
        axisx = QCategoryAxis(chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue)

        axisx.setGridLineVisible(False)  # 隐藏网格线条
        axisx.setTickCount(len(category))  # 设置刻度个数
        minx = chart.axisX().min()
        maxx = chart.axisX().max()
        tickc = chart.axisX().tickCount()
        print(tickc)
        if tickc < 2:
            axisx.append(category[0])
        else:
            step = (maxx - minx) / (tickc - 1)  # tickc>=2
            for i in range(0, tickc):
                axisx.append(category[i], minx + i * step)
                # 保存x轴值
        chart.setAxisX(axisx, series[-1])

    def onSeriesHoverd(self, point, state):
            # 鼠标悬停事件(底部x,y)
            if state:
                try:
                    name = self.sender().name()
                except:
                    # QCursor.pos()悬停提示文字显示的位置
                    name = ""
                QToolTip.showText(QCursor.pos(), "%s\nx: %s\ny: %s" %
                                  (name, point.x(), point.y()))

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    # 初始化所有视图
    login = View_event()

    login.show()

    sys.exit(app.exec_())

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值