如何在 PyQt 中更改 QChart 的轴?
How to change axIs of a QChart in PyQt?
在我的 PyQt 应用程序的主要 window 中,我有一个 QChartView。
在某个时刻,我收集了某些图像的温度并将它们分组到数组中(平均温度、最低温度和最高温度)。我的目标是在折线图中公开这一点。我创建了一个方法来创建 QChart 对象并用必要的元素(轴、QLineSeries、图例...)填充它,然后在 QChartView 中设置它。
这是创建 QChart 的代码:
def loadChart(self):
self.series_average = QLineSeries()
self.series_max = QLineSeries()
self.series_min = QLineSeries()
self.loadSerie_average()
self.loadSerie_max()
self.loadSerie_min()
chart = QChart()
chart.legend().setVisible(True)
chart.addSeries(self.series_average)
chart.addSeries(self.series_max)
chart.addSeries(self.series_min)
chart.createDefaultAxes()
self.chartView.setChart(chart)
以下是我用温度数组中的值填充 QLineSeries 的方法:
def loadSerie_average(self):
for index, element in enumerate(self.array_average):
image_num = index + 1
self.series_average.append(image_num, element)
self.series_average.setName('Temperatura Média')
def loadSerie_max(self):
for index, element in enumerate(self.array_max):
image_num = index + 1
self.series_max.append(image_num, element)
self.series_max.setName('Temperatura Máxima')
def loadSerie_min(self):
for index, element in enumerate(self.array_min):
image_num = index + 1
self.series_min.append(image_num, element)
self.series_min.setName('Temperatura Minima')
这是生成的折线图的当前输出。
手头的问题是温度值之间的差异比较小。在这种情况下,createDefaultAxes() 方法生成一个具有更小间隔和更小刻度的折线图。但这不能满足我的需要。我需要 Y 轴从 24.0 到 39.0,间隔为 1.0。此外,X 轴上的刻度必须以整数形式显示。
阅读文档,我发现要创建具有特定特征的轴,必须创建 QValueAxis 对象,我尝试了以下解决方案:
y_axis = QValueAxis()
y_axis.setRange(24.0, 39.0)
y_axis.setLabelFormat("%0.2f")
y_axis.setTickCount(1)
y_axis.setMinorTickCount(0)
y_axis.setTitleText("Temperatures")
x_axis = QValueAxis()
x_axis.setRange(1, len(self.array_average))
x_axis.setLabelFormat("%d")
x_axis.setTickCount(1)
x_axis.setMinorTickCount(1)
x_axis.setTitleText("Exams")
chart = QChart()
chart.legend().setVisible(True)
chart.addSeries(self.series_average)
chart.addSeries(self.series_max)
chart.addSeries(self.series_min)
# chart.createDefaultAxes()
chart.addAxis(x_axis, QtCore.Qt.AlignmentFlag.AlignBottom)
chart.addAxis(y_axis, QtCore.Qt.AlignmentFlag.AlignLeft)
self.chartView.setChart(chart)
但是最后生成的折线图没有变化。你能帮我理解为什么生成的折线图没有改变,如何生成适合我的折线图?
想做这样的东西。
这样视图更加集中。我觉得比较合适
您可以使用下面的代码片段重现该问题。如果您取消注释 createDefaultAxes 方法行并再次 运行 它,您将看到 linesseries 发生变化,即使数组值相同。
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis
import sys
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Trouble LineChart")
self.setGeometry(100,100, 680,500)
self.array_medias = [28.284563290387887, 28.170853249077403, 28.776281519708895, 29.041099232443074, 29.232627358676552]
self.array_maximas = [33.4762780011805, 33.4762780011805, 33.61541095358507, 33.929353828043304, 33.929353828043304]
self.array_minimas = [20.46583000704794, 20.288281209883735, 20.772403295556217, 21.20685421472882, 21.625995561649745]
self.show()
self.loadChart()
def loadChart(self):
self.series_media = QLineSeries()
self.series_maxima = QLineSeries()
self.series_minima = QLineSeries()
self.loadSerie_media()
self.loadSerie_maxima()
self.loadSerie_minima()
y_axis = QValueAxis()
y_axis.setRange(24.0, 40.0)
y_axis.setLabelFormat("%0.1f")
y_axis.setTickType(QValueAxis.TickType.TicksDynamic)
y_axis.setTickInterval(0.5)
y_axis.setTitleText("Temperaturas")
x_axis = QValueAxis()
x_axis.setRange(1, len(self.array_medias))
x_axis.setLabelFormat("%d")
x_axis.setTickType(QValueAxis.TickType.TicksDynamic)
x_axis.setTickInterval(1)
x_axis.setTitleText("Exames")
chart = QChart()
chart.addAxis(x_axis, QtCore.Qt.AlignmentFlag.AlignBottom)
chart.addAxis(y_axis, QtCore.Qt.AlignmentFlag.AlignLeft)
chart.legend().setVisible(True)
chart.addSeries(self.series_media)
chart.addSeries(self.series_maxima)
chart.addSeries(self.series_minima)
#chart.createDefaultAxes()
self.chartView = QChartView(chart)
self.chartView.setGeometry(QtCore.QRect(100, 100, 680, 500))
self.chartView.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing)
self.setCentralWidget(self.chartView)
def loadSerie_media(self):
for index, element in enumerate(self.array_medias):
image_num = index + 1
self.series_media.append(image_num, element)
self.series_media.setName('Temperatura Média')
def loadSerie_maxima(self):
for index, element in enumerate(self.array_maximas):
image_num = index + 1
self.series_maxima.append(image_num, element)
self.series_maxima.setName('Temperatura Máxima')
def loadSerie_minima(self):
for index, element in enumerate(self.array_minimas):
image_num = index + 1
self.series_minima.append(image_num, element)
self.series_minima.setName('Temperatura Minima')
App = QtWidgets.QApplication(sys.argv)
window = Ui_MainWindow()
sys.exit(App.exec())
你必须设置 tickType
property of QValueAxis to TicksDynamic
, and the tickInterval
属性:
y_axis = QValueAxis()
y_axis.setRange(24.0, 39.0)
y_axis.setLabelFormat("%0.2f")
y_axis.setTickType(QValueAxis.TickType.TicksDynamic)
y_axis.setTickInterval(1)
y_axis.setTitleText("Temperatures")
x_axis = QValueAxis()
x_axis.setRange(1, self.series_average.count())
x_axis.setLabelFormat("%d")
y_axis.setTickType(QValueAxis.TickType.TicksDynamic)
y_axis.setTickInterval(1)
x_axis.setTitleText("Exams")
更新
您必须将轴附加到系列:
chart.addSeries(self.series_media)
chart.addSeries(self.series_maxima)
chart.addSeries(self.series_minima)
for series in chart.series():
series.attachAxis(x_axis)
series.attachAxis(y_axis)
另一方面,enumerate有个参数可以修改start:
for index, element in enumerate(self.array_medias, start=1):
self.series_media.append(index, element)
您还必须更改范围,因为该值不合适:
y_axis.setRange(20.0, 40.0)
在我的 PyQt 应用程序的主要 window 中,我有一个 QChartView。
在某个时刻,我收集了某些图像的温度并将它们分组到数组中(平均温度、最低温度和最高温度)。我的目标是在折线图中公开这一点。我创建了一个方法来创建 QChart 对象并用必要的元素(轴、QLineSeries、图例...)填充它,然后在 QChartView 中设置它。
这是创建 QChart 的代码:
def loadChart(self):
self.series_average = QLineSeries()
self.series_max = QLineSeries()
self.series_min = QLineSeries()
self.loadSerie_average()
self.loadSerie_max()
self.loadSerie_min()
chart = QChart()
chart.legend().setVisible(True)
chart.addSeries(self.series_average)
chart.addSeries(self.series_max)
chart.addSeries(self.series_min)
chart.createDefaultAxes()
self.chartView.setChart(chart)
以下是我用温度数组中的值填充 QLineSeries 的方法:
def loadSerie_average(self):
for index, element in enumerate(self.array_average):
image_num = index + 1
self.series_average.append(image_num, element)
self.series_average.setName('Temperatura Média')
def loadSerie_max(self):
for index, element in enumerate(self.array_max):
image_num = index + 1
self.series_max.append(image_num, element)
self.series_max.setName('Temperatura Máxima')
def loadSerie_min(self):
for index, element in enumerate(self.array_min):
image_num = index + 1
self.series_min.append(image_num, element)
self.series_min.setName('Temperatura Minima')
这是生成的折线图的当前输出。
手头的问题是温度值之间的差异比较小。在这种情况下,createDefaultAxes() 方法生成一个具有更小间隔和更小刻度的折线图。但这不能满足我的需要。我需要 Y 轴从 24.0 到 39.0,间隔为 1.0。此外,X 轴上的刻度必须以整数形式显示。
阅读文档,我发现要创建具有特定特征的轴,必须创建 QValueAxis 对象,我尝试了以下解决方案:
y_axis = QValueAxis()
y_axis.setRange(24.0, 39.0)
y_axis.setLabelFormat("%0.2f")
y_axis.setTickCount(1)
y_axis.setMinorTickCount(0)
y_axis.setTitleText("Temperatures")
x_axis = QValueAxis()
x_axis.setRange(1, len(self.array_average))
x_axis.setLabelFormat("%d")
x_axis.setTickCount(1)
x_axis.setMinorTickCount(1)
x_axis.setTitleText("Exams")
chart = QChart()
chart.legend().setVisible(True)
chart.addSeries(self.series_average)
chart.addSeries(self.series_max)
chart.addSeries(self.series_min)
# chart.createDefaultAxes()
chart.addAxis(x_axis, QtCore.Qt.AlignmentFlag.AlignBottom)
chart.addAxis(y_axis, QtCore.Qt.AlignmentFlag.AlignLeft)
self.chartView.setChart(chart)
但是最后生成的折线图没有变化。你能帮我理解为什么生成的折线图没有改变,如何生成适合我的折线图?
想做这样的东西。
这样视图更加集中。我觉得比较合适
您可以使用下面的代码片段重现该问题。如果您取消注释 createDefaultAxes 方法行并再次 运行 它,您将看到 linesseries 发生变化,即使数组值相同。
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCharts import QChart, QChartView, QLineSeries, QValueAxis
import sys
class Ui_MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Trouble LineChart")
self.setGeometry(100,100, 680,500)
self.array_medias = [28.284563290387887, 28.170853249077403, 28.776281519708895, 29.041099232443074, 29.232627358676552]
self.array_maximas = [33.4762780011805, 33.4762780011805, 33.61541095358507, 33.929353828043304, 33.929353828043304]
self.array_minimas = [20.46583000704794, 20.288281209883735, 20.772403295556217, 21.20685421472882, 21.625995561649745]
self.show()
self.loadChart()
def loadChart(self):
self.series_media = QLineSeries()
self.series_maxima = QLineSeries()
self.series_minima = QLineSeries()
self.loadSerie_media()
self.loadSerie_maxima()
self.loadSerie_minima()
y_axis = QValueAxis()
y_axis.setRange(24.0, 40.0)
y_axis.setLabelFormat("%0.1f")
y_axis.setTickType(QValueAxis.TickType.TicksDynamic)
y_axis.setTickInterval(0.5)
y_axis.setTitleText("Temperaturas")
x_axis = QValueAxis()
x_axis.setRange(1, len(self.array_medias))
x_axis.setLabelFormat("%d")
x_axis.setTickType(QValueAxis.TickType.TicksDynamic)
x_axis.setTickInterval(1)
x_axis.setTitleText("Exames")
chart = QChart()
chart.addAxis(x_axis, QtCore.Qt.AlignmentFlag.AlignBottom)
chart.addAxis(y_axis, QtCore.Qt.AlignmentFlag.AlignLeft)
chart.legend().setVisible(True)
chart.addSeries(self.series_media)
chart.addSeries(self.series_maxima)
chart.addSeries(self.series_minima)
#chart.createDefaultAxes()
self.chartView = QChartView(chart)
self.chartView.setGeometry(QtCore.QRect(100, 100, 680, 500))
self.chartView.setRenderHint(QtGui.QPainter.RenderHint.Antialiasing)
self.setCentralWidget(self.chartView)
def loadSerie_media(self):
for index, element in enumerate(self.array_medias):
image_num = index + 1
self.series_media.append(image_num, element)
self.series_media.setName('Temperatura Média')
def loadSerie_maxima(self):
for index, element in enumerate(self.array_maximas):
image_num = index + 1
self.series_maxima.append(image_num, element)
self.series_maxima.setName('Temperatura Máxima')
def loadSerie_minima(self):
for index, element in enumerate(self.array_minimas):
image_num = index + 1
self.series_minima.append(image_num, element)
self.series_minima.setName('Temperatura Minima')
App = QtWidgets.QApplication(sys.argv)
window = Ui_MainWindow()
sys.exit(App.exec())
你必须设置 tickType
property of QValueAxis to TicksDynamic
, and the tickInterval
属性:
y_axis = QValueAxis()
y_axis.setRange(24.0, 39.0)
y_axis.setLabelFormat("%0.2f")
y_axis.setTickType(QValueAxis.TickType.TicksDynamic)
y_axis.setTickInterval(1)
y_axis.setTitleText("Temperatures")
x_axis = QValueAxis()
x_axis.setRange(1, self.series_average.count())
x_axis.setLabelFormat("%d")
y_axis.setTickType(QValueAxis.TickType.TicksDynamic)
y_axis.setTickInterval(1)
x_axis.setTitleText("Exams")
更新
您必须将轴附加到系列:
chart.addSeries(self.series_media)
chart.addSeries(self.series_maxima)
chart.addSeries(self.series_minima)
for series in chart.series():
series.attachAxis(x_axis)
series.attachAxis(y_axis)
另一方面,enumerate有个参数可以修改start:
for index, element in enumerate(self.array_medias, start=1):
self.series_media.append(index, element)
您还必须更改范围,因为该值不合适:
y_axis.setRange(20.0, 40.0)