Как отобразить K означает график кластеризации в graphWidget пользовательского интерфейса, используя pyqt5? - PullRequest
0 голосов
/ 30 января 2020

Я разрабатываю пользовательский интерфейс, в котором я хочу отобразить результаты кластеризации K-Means набора данных. Для этого я использую сюжетный виджет в pyqtgraph. Код этого кода следующий:

    from sklearn.cluster import KMeans 

    clusters = 3

    kmeans = KMeans(n_clusters = clusters, init = 'k-means++') 
    kmeans.fit(Data4)
    y_means = kmeans.predict(Data4)

    self.plot(Data4[0], Data4[1])

    def plot(self, Sdata1, Sdata2):

    self.graphWidget1.plot(Sdata1, Sdata2, pen=None, symbol='o')

Итак, эта вещь дает мне диаграмму рассеяния, но без разных цветовых соглашений, используемых для разных кластеров. Для иллюстрации я получаю это

K means result in Pyqt UI

Но я хочу, чтобы это отображалось:

K means result in actual

Любая помощь в этом вопросе будет оценена

1 Ответ

0 голосов
/ 31 января 2020

Один из способов - построить каждую коллекцию точек по отдельности, например,

from sklearn.cluster import KMeans
import pyqtgraph
from PyQt5 import QtWidgets, QtCore, QtGui
import numpy as np

class Widget(QtWidgets.QWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        nclusters = 3
        self.data = np.random.random((1000,2)) * 10

        kmeans = KMeans(n_clusters=nclusters, init='k-means++')
        kmeans.fit(self.data)
        predict = np.array(kmeans.predict(self.data))

        self.graph = pyqtgraph.PlotWidget(self, background='w')
        for i in range(kmeans.n_clusters):
            brush = QtGui.QBrush(pyqtgraph.intColor(i, 3, alpha = 150))
            pen_color = QtGui.QColor(pyqtgraph.intColor(i, 3))
            self.graph.scatterPlot(self.data[predict == i], symbolBrush = brush, pen = pen_color)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.graph)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = Widget()
    window.show()
    window.resize(400,400)
    app.exec_()

В качестве альтернативы, вы можете построить все точки одновременно, но предоставить массив цветов и кистей пера, например,

class Widget(QtWidgets.QWidget):

    def __init__(self, *args, **kwargs):

        ...

        self.graph = pyqtgraph.PlotWidget(self, background='w')
        colors = [pyqtgraph.intColor(i, 3, alpha=150) for i in self.predict]
        pens = [QtGui.QPen(pyqtgraph.intColor(i, 3), 0) for i in self.predict]
        self.graph.scatterPlot(self.data, pen=pens, symbolBrush=colors)

        ...

Снимок экрана:

screenshot of result

...