QScatterSeries 点在 QCharts 上绘制时不可见

QScatterSeries points invisibles when plotted on QCharts

我正在尝试使用 QScatterSeries 绘制一个 numpy 数组,但是只有轴被更新而点没有显示。我不确定为什么它不起作用。

from PySide2.QtCore import Qt
from PySide2.QtWidgets import QWidget, QHBoxLayout
from PySide2.QtGui import QColor, QPen
from PySide2.QtCharts import QtCharts


class ProjectionWindow(QWidget):
    """
    TODO
    """
    def __init__(self, parent=None) -> 'None':
        super().__init__()
        self.setWindowTitle('Projection')
        self.resize(800, 800)
        self.chart = QtCharts.QChart()
        self.chart_view = QtCharts.QChartView(self.chart)
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.chart_view)
        self.setLayout(self.layout)
        self.show()


    def loadCharts(self, data: 'ndarray') -> 'None':
        points = QtCharts.QScatterSeries()
        points.setMarkerSize(2.0)
        for i in range(data.shape[0]):
            points.append(data[i, 0], data[i, 1])
        self.chart.addSeries(points)
        self.chart.createDefaultAxes()
        self.chart.show()

这是我调用时的当前结果

import sys
import numpy as np
from PySide2.QtWidgets import QApplication
from ui.projectionwindow import ProjectionWindow

if __name__ == "__main__":

    app = QApplication(sys.argv)
    data = np.array([[1,2],
                     [3,4]])
    window = ProjectionWindow(app)
    window.loadCharts(data)

    sys.exit(app.exec_())

得到的结果:

您有 2 个错误:

  • markerSize 非常小,肉眼无法区分。
  • 第一次建立系列时,QChart取最小矩形,所以在你的情况下它在角落里,所以解决方案是考虑到足够的余量,改变轴的最小值和最大值。
def loadCharts(self, data: "ndarray") -> "None":
    points = QtCharts.QScatterSeries()
    <b>points.setMarkerSize(20)</b>
    for i in range(data.shape[0]):
        points.append(data[i, 0], data[i, 1])

    self.chart.addSeries(points)
    self.chart.createDefaultAxes()

    <b>m_x, M_x = min(data[:, 0]), max(data[:, 0])
    m_y, M_y = min(data[:, 1]), max(data[:, 1])

    ax = self.chart.axes(Qt.Horizontal, points)[0]
    ax.setMin(m_x - 1)
    ax.setMax(M_x + 1)

    ay = self.chart.axes(Qt.Vertical, points)[0]
    ay.setMin(m_y - 1)
    ay.setMax(M_y + 1)</b>

输出: