Как вставить кастомную картинку в 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

