如有不对,请大佬不吝赐教.
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_())