Как вставить кастомную картинку в QScatterSeries

Пример графика с одним классом scatter (можно сделать больше, переменная listCount), константным по Y. Отрисовка по дефолту - синий шарик.

И пусть у нас есть небольшая картинка, например 30х30 px, лежащая в той же папке.
Как вместо шариков добавить картинку?

Нашёл единственное объяснение по ссылке, пытался приспособить, но не справился.

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


img = "image.png"

class Window(QChartView):
    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.resize(400, 300)
        self.setRenderHint(QPainter.Antialiasing)
        self.m_dataTable = self.generateRandomData(1, 10, 5)
        chart = QChart()
        self.setChart(chart)
        chart.setTitle('Scatter chart')
        self.getSeries(chart)
        chart.createDefaultAxes()
        chart.legend().setVisible(False)

    # передаёт в график список списков серий
    def getSeries(self, chart):
        for i, data_list in enumerate(self.m_dataTable):
            series = QScatterSeries(chart)
            series.setMarkerShape(QScatterSeries.MarkerShapeRectangle)
            series.setMarkerSize(15.0)
            for value, _ in data_list:
                series.append(value)
                print(value)
                #series.setSelectedColor('darkred')
            series.setName('Series ' + str(i))
            chart.addSeries(series)

    # генерит список списков серий
    # listCount - количество классов
    def generateRandomData(self, listCount, valueMax, valueCount):              # valueMax - максимальное значение по 'x'
        random.seed()
        dataTable = []
        for i in range(listCount):                    # сколько классов
            dataList = []
            yValue = 0.0                              # valueCount сколько шаров в классе
            f_valueCount = float(valueCount)          # максимальное значение по 'x'
            for j in range(valueCount):
                value = QPointF(j + random.random() * valueMax / f_valueCount, yValue)
                label = 'Slice ' + str(i) + ':' + str(j)
                dataList.append((value, label))
            dataTable.append(dataList)
        return dataTable


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec())

Ответы (1 шт):

Автор решения: S. Nick

void QBrush::setTextureImage(const QImage &image)

Sets the brush image to image.


import sys
import random
'''
from PySide6.QtCore import *
from PySide6.QtWidgets import *
from PySide6.QtCharts import *
from PySide6.QtGui import *
'''
from PyQt5.Qt import *
from PyQt5.QtChart import *


class Window(QChartView):
    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.resize(500, 300)
        self.setRenderHint(QPainter.Antialiasing)
        #self.setRubberBand(QChartView.RectangleRubberBand)
        
        self.m_dataTable = self.generateRandomData(1, 10, 5)
        
        self.chart = QChart()
        self.setChart(self.chart)
        self.chart.setTitle('Scatter chart')
        
        self.getSeries(self.chart)

        self.chart.createDefaultAxes()
        self.chart.legend().setVisible(False)

    # передаёт в график список списков серий 
    def getSeries(self, chart):
        for i, data_list in enumerate(self.m_dataTable):
            self.series = QScatterSeries(chart) 
            self.series.setMarkerShape(QScatterSeries.MarkerShapeCircle)
            self.series.setName("scatter3")
            self.series.setMarkerSize(50.0)
            
            self.star = QImage(50, 50, QImage.Format_ARGB32); # Format_ARGB32
            self.star.fill(Qt.transparent)
            
            self.image = QPixmap("lena2.png").scaled(50, 50)

            self.painter = QPainter(self.star)
            self.painter.setRenderHint(QPainter.Antialiasing)
            self.painter.drawPixmap(0, 0, self.image);

            self.series.setPen(QPen(Qt.red, 2, Qt.SolidLine))   # ?
            
            brush = QBrush(Qt.red)
            brush.setTextureImage(self.star)                    # <-------------- !!!
            self.series.setBrush(brush)
            
            self.series.hovered.connect(self.on_point_hover)
            
            for value, _ in data_list:
                self.series.append(value)
                #print(value)
            self.series.setName("scatter3");
            self.chart.addSeries(self.series)

    def on_point_hover(self):
        print("point hover")            

    # генерит список списков серий
    def generateRandomData(self, listCount, valueMax, valueCount): 
        random.seed()
        dataTable = []
        for i in range(listCount):                 # сколько классов
            dataList = []
            yValue = 0.0                           # valueCount сколько шаров в классе
            f_valueCount = float(valueCount)       # максимальное значение по 'x'
            for j in range(valueCount):
                value = QPointF(j + random.random() * valueMax / f_valueCount, yValue)
                label = 'Slice ' + str(i) + ':' + str(j)
                dataList.append((value, label))
            dataTable.append(dataList)
        return dataTable


class MainWindow(QWidget): 
    def __init__(self):
        super(MainWindow, self).__init__()

        self.win = Window() 
        
        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.win) 
     

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())

lena2.png

введите сюда описание изображения


введите сюда описание изображения

→ Ссылка