如何在 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)