pyqt5,Qchart画折线图,设定多个不同刻度的Y轴,修改自定义折线图的坐标轴,改变折线图的底色

就是这些自己遇到的需求:

如有不对,请大佬不吝赐教.
Qchart设定多个不同刻度的Y轴
修改自定义折线图的坐标轴
改变折线图的底色,底色透明
鼠标悬停事件

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_())

执行效果如下,如果要将折线对应y轴,需要自定义y轴的颜色(设置成和折线相对应的颜色,应该是在QValueAxis里有个设置颜色的变量)!!!

执行效果

  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值