Chapter 6 - Plot the data in the ChartView

The last step of this tutorial is to plot the CSV data inside our QChart. For this, you need to go over our data and include the data on a QLineSeries.

After adding the data to the series, you can modify the axis to properly display the QDateTime on the X-axis, and the magnitude values on the Y-axis.

Here is the updated main_widget.py that includes an additional function to plot data using a QLineSeries:

 1from __future__ import annotations
 2
 3from PySide6.QtCore import QDateTime, Qt
 4from PySide6.QtGui import QPainter
 5from PySide6.QtWidgets import (QWidget, QHeaderView, QHBoxLayout, QTableView,
 6                               QSizePolicy)
 7from PySide6.QtCharts import QChart, QChartView, QLineSeries, QDateTimeAxis, QValueAxis
 8
 9from table_model import CustomTableModel
10
11
12class Widget(QWidget):
13    def __init__(self, data):
14        QWidget.__init__(self)
15
16        # Getting the Model
17        self.model = CustomTableModel(data)
18
19        # Creating a QTableView
20        self.table_view = QTableView()
21        self.table_view.setModel(self.model)
22
23        # QTableView Headers
24        resize = QHeaderView.ResizeToContents
25        self.horizontal_header = self.table_view.horizontalHeader()
26        self.vertical_header = self.table_view.verticalHeader()
27        self.horizontal_header.setSectionResizeMode(resize)
28        self.vertical_header.setSectionResizeMode(resize)
29        self.horizontal_header.setStretchLastSection(True)
30
31        # Creating QChart
32        self.chart = QChart()
33        self.chart.setAnimationOptions(QChart.AllAnimations)
34        self.add_series("Magnitude (Column 1)", [0, 1])
35
36        # Creating QChartView
37        self.chart_view = QChartView(self.chart)
38        self.chart_view.setRenderHint(QPainter.Antialiasing)
39
40        # QWidget Layout
41        self.main_layout = QHBoxLayout()
42        size = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
43
44        # Left layout
45        size.setHorizontalStretch(1)
46        self.table_view.setSizePolicy(size)
47        self.main_layout.addWidget(self.table_view)
48
49        # Right Layout
50        size.setHorizontalStretch(4)
51        self.chart_view.setSizePolicy(size)
52        self.main_layout.addWidget(self.chart_view)
53
54        # Set the layout to the QWidget
55        self.setLayout(self.main_layout)
56
57    def add_series(self, name, columns):
58        # Create QLineSeries
59        self.series = QLineSeries()
60        self.series.setName(name)
61
62        # Filling QLineSeries
63        for i in range(self.model.rowCount()):
64            # Getting the data
65            t = self.model.index(i, 0).data()
66            date_fmt = "yyyy-MM-dd HH:mm:ss.zzz"
67
68            x = QDateTime().fromString(t, date_fmt).toSecsSinceEpoch()
69            y = float(self.model.index(i, 1).data())
70
71            if x > 0 and y > 0:
72                self.series.append(x, y)
73
74        self.chart.addSeries(self.series)
75
76        # Setting X-axis
77        self.axis_x = QDateTimeAxis()
78        self.axis_x.setTickCount(10)
79        self.axis_x.setFormat("dd.MM (h:mm)")
80        self.axis_x.setTitleText("Date")
81        self.chart.addAxis(self.axis_x, Qt.AlignBottom)
82        self.series.attachAxis(self.axis_x)
83        # Setting Y-axis
84        self.axis_y = QValueAxis()
85        self.axis_y.setTickCount(10)
86        self.axis_y.setLabelFormat("%.2f")
87        self.axis_y.setTitleText("Magnitude")
88        self.chart.addAxis(self.axis_y, Qt.AlignLeft)
89        self.series.attachAxis(self.axis_y)
90
91        # Getting the color from the QChart to use it on the QTableView
92        color_name = self.series.pen().color().name()
93        self.model.color = f"{color_name}"

Now, run the application to visualize the earthquake magnitudes data at different times.

Data Visualization Screenshot

Try modifying the sources to get different output. For example, you could try to plot more data from the CSV.