79608442

Date: 2025-05-06 10:05:58
Score: 2
Natty:
Report link

I found a working example in metalshreds last comment in this thread:

forum.qt.io/topic/105570/qgraphicstextitem-over-qchartview/4

Updated for pyside6

import sys
from PySide6.QtCharts import *
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *

import numpy as np

class Chart(QMainWindow):
    def __init__(self):
        super().__init__()

        # chart creation hierarchy:
        # chartview-->charts-->series-->set(or points)

        # create chart widget
        self.chart = QChart()
        self.chart.legend().setVisible(False)
        self.chart.setTitle("Phasor Plot")
        self.setGeometry(0, 0, 800, 500)
        self.list_label_graphics_text_item = []

        # create chartview
        self.chartView = QChartView(self.chart)
        self.chartView.setRenderHint(QPainter.Antialiasing)

        self.chart.scene().changed.connect(self.update_label_position)

        self.g = [0.94058736, 0.79830002, 0.49735222, 0.3054408,  0.19831079, 0.1366765,
         0.09905082, 0.074736,   0.0582399,  0.04658614, 0.03807176]
        self.s = [0.23639539, 0.40126936, 0.49999299, 0.46059387, 0.3987275,  0.34350551,
         0.29873024, 0.26296489, 0.23419652, 0.21075073, 0.19136954]

        self.lifetime_labels = ['0.5ns', '1ns', '2ns', '3ns', '4ns', '5ns', '6ns', '7ns', '8ns', '9ns', '10ns']


        # series - lifetime labels
        series_lifetime_markers = QScatterSeries()
        for pos in np.arange(len(self.lifetime_labels)):
            series_lifetime_markers.append(self.g[pos], self.s[pos])


        ''' chart - add series'''
        self.chart.addSeries(series_lifetime_markers)

        # x_axis
        self.axis_x = QValueAxis()
        self.axis_x.setRange(0, 1)
        self.axis_x.setTickCount(15)
        self.axis_x.setLabelFormat("%.2f")
        self.axis_x.setTitleText("g")
        self.chart.setAxisX(self.axis_x, series_lifetime_markers)

        # y_axis
        self.axis_y = QValueAxis()
        self.axis_y.setRange(0, 0.7)
        self.axis_y.setTickCount(15)
        self.axis_y.setLabelFormat("%.2f")
        self.axis_y.setTitleText("s")
        self.chart.setAxisY(self.axis_y, series_lifetime_markers)

        ''' LAYOUTS '''
        layout = QVBoxLayout()
        layout.addWidget(self.chartView)
        self.setCentralWidget(QWidget(self))
        self.centralWidget().setLayout(layout)

    def update_label_position(self):
        ''' position labels over chart '''
        # https://www.qtcentre.org/threads/68981-QChart-QDateTiemAxis-mapTo-and-mapFrom
        # https://stackoverflow.com/questions/44067831/get-mouse-coordinates-in-qchartviews-axis-system

        # populate list of labels graphicsTextItems
        if len(self.list_label_graphics_text_item) == 0:
            for pos in np.arange(len(self.g)):  # iterate through g coordinates
                label = QGraphicsTextItem(self.lifetime_labels[pos])
                self.list_label_graphics_text_item.append(label)
                self.chart.scene().addItem(label)

        # position the labels
        for pos, label in enumerate(self.list_label_graphics_text_item):
            point_in_series = QPointF(self.g[pos], self.s[pos])  # position in series
            point_series_to_chart = self.chart.mapToPosition(point_in_series, self.chart.series()[0])
            point_chart_to_scene = self.chart.mapToScene(point_series_to_chart)
            label.setPos(point_chart_to_scene)

        print(f'{self.lifetime_labels[pos]}: pos in series {point_in_series}\n'
              f'pos in chart: {point_series_to_chart}\n'
              f'pos in scene: {point_chart_to_scene}\n')


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Chart()
    window.show()

    sys.exit(app.exec_())
Reasons:
  • Blacklisted phrase (1): stackoverflow
  • Probably link only (1):
  • Long answer (-1):
  • Has code block (-0.5):
  • Self-answer (0.5):
  • Low reputation (1):
Posted by: Tom Woodland