PyQt/QtChart/CustomXYaxis.py

155 lines
4.8 KiB
Python
Raw Permalink Normal View History

2018-12-28 10:48:24 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
2021-07-13 14:52:26 +08:00
"""
2018-12-28 10:48:24 +08:00
Created on 2017年12月19日
2021-07-13 14:52:26 +08:00
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
2018-12-28 10:48:24 +08:00
@email: 892768447@qq.com
@file: CustomXYaxis
@description:
2021-07-13 14:52:26 +08:00
"""
2018-12-28 10:48:24 +08:00
import random
import sys
2021-07-13 14:52:26 +08:00
try:
from PyQt5.QtChart import QChartView, QLineSeries, QChart, QCategoryAxis
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout
except ImportError:
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QWidget, QHBoxLayout
from PySide2.QtCharts import QtCharts
2018-12-28 10:48:24 +08:00
2021-07-13 14:52:26 +08:00
QChartView = QtCharts.QChartView
QChart = QtCharts.QChart
QLineSeries = QtCharts.QLineSeries
QCategoryAxis = QtCharts.QCategoryAxis
2018-12-28 10:48:24 +08:00
m_listCount = 3
m_valueMax = 10
m_valueCount = 7
def generateRandomData(listCount, valueMax, valueCount):
random.seed()
dataTable = []
for i in range(listCount):
dataList = []
yValue = 0.0
f_valueCount = float(valueCount)
for j in range(valueCount):
yValue += random.uniform(0, valueMax) / f_valueCount
value = j + random.random() * m_valueMax / f_valueCount, yValue
label = "Slice " + str(i) + ":" + str(j)
dataList.append((value, label))
dataTable.append(dataList)
return dataTable
m_dataTable = generateRandomData(m_listCount, m_valueMax, m_valueCount)
def getChart(title):
chart = QChart(title=title)
for i, data_list in enumerate(m_dataTable):
series = QLineSeries(chart)
for value, _ in data_list:
series.append(*value)
series.setName("Series " + str(i))
chart.addSeries(series)
chart.createDefaultAxes() # 创建默认的轴
return chart
def customAxisX(chart):
# 自定义x轴(均分)
series = chart.series()
if not series:
return
axisx = QCategoryAxis(
chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue)
minx = chart.axisX().min()
maxx = chart.axisX().max()
tickc = chart.axisX().tickCount()
if tickc < 2:
axisx.append("lable0", minx)
else:
step = (maxx - minx) / (tickc - 1) # tickc>=2
for i in range(0, tickc):
axisx.append("lable%s" % i, minx + i * step)
chart.setAxisX(axisx, series[-1])
def customTopAxisX(chart):
# 自定义top x轴
series = chart.series()
if not series:
return
category = ["%d" % i for i in range(1, 9)] # 1-8月
axisx = QCategoryAxis(
chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue)
axisx.setGridLineVisible(False) # 隐藏网格线条
axisx.setTickCount(len(category)) # 设置刻度个数
chart.axisX().setTickCount(len(category)) # 强制修改x轴的刻度个数一致
minx = chart.axisX().min()
maxx = chart.axisX().max()
tickc = chart.axisX().tickCount()
step = (maxx - minx) / (tickc - 1) # tickc>=2
for i in range(0, tickc):
axisx.append(category[i], minx + i * step)
chart.addAxis(axisx, Qt.AlignTop) # 添加到右侧
series[-1].attachAxis(axisx) # 附加到series上
def customAxisY(chart):
# 自定义y轴(不等分)
series = chart.series()
if not series:
return
category = ["周一", "周二", "周三", "周四",
"周五", "周六", "周日"]
axisy = QCategoryAxis(
chart, labelsPosition=QCategoryAxis.AxisLabelsPositionOnValue)
axisy.setGridLineVisible(False) # 隐藏网格线条
axisy.setTickCount(len(category)) # 设置刻度个数
miny = chart.axisY().min()
maxy = chart.axisY().max()
tickc = axisy.tickCount()
if tickc < 2:
axisy.append(category[0])
else:
step = (maxy - miny) / (tickc - 1) # tickc>=2
for i in range(0, tickc):
axisy.append(category[i], miny + i * step)
chart.addAxis(axisy, Qt.AlignRight) # 添加到右侧
series[-1].attachAxis(axisy) # 附加到series上
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
layout = QHBoxLayout(self)
# 自定义x轴(和原来的x轴值对应等分)
chart = getChart("自定义x轴(和原来的x轴值对应等分)")
customAxisX(chart)
layout.addWidget(QChartView(chart, self))
# 自定义添加右侧y轴(等分,与左侧不对应)
chart = getChart("自定义添加右侧y轴(等分,与左侧不对应)")
customAxisY(chart)
layout.addWidget(QChartView(chart, self))
# 自定义top x轴(按现有新的x轴划分)
chart = getChart("自定义top x轴(按现有新的x轴划分)")
customTopAxisX(chart)
layout.addWidget(QChartView(chart, self))
if __name__ == "__main__":
app = QApplication(sys.argv)
view = Window()
view.resize(800, 600)
view.show()
sys.exit(app.exec_())