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_())
PyQt5折线图鼠标悬停显示坐标实现
于 2022-11-08 16:31:00 首次发布