Показывать графики Matplotlib в PyQt при запуске кода в Spyder - PullRequest
0 голосов
/ 17 января 2019

видел эту программу обнаружения сердечных заболеваний в GitHub, и мне было интересно, смогу ли я отобразить сгенерированный график в GUI, используя PyQt. Я попытался отобразить его в окне PyQt, и пока он появляется во всплывающем окне, но вместо этого график появляется в консоли Python IDE. Вот оригинальный код, с которым я играл:

#This code performs the classification  of heart  disease by labeling the predicted values
# in various classes, namely 0 for absence and 1 to 4 for presence and also try  
# to check the model performance by comparing it against other Classifiers

from numpy import genfromtxt
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC
from sklearn.decomposition import PCA
import pylab as pl
from itertools import cycle
from sklearn import cross_validation
from sklearn.svm import SVC 
from IPython import get_ipython

class problem:
#Loading and pruning the data
    dataset = genfromtxt('cleveland_data.csv',dtype = float, delimiter=',')
    #print dataset
    X = dataset[:,0:12] #Feature Set
    y = dataset[:,13]   #Label Set

    #Method to plot the graph for reduced Dimesions
    def plot_2D(data, target, target_names):
         colors = cycle('rgbcmykw')
         target_ids = range(len(target_names))
         plt.figure()
         for i, c, label in zip(target_ids, colors, target_names):
             plt.scatter(data[target == i, 0], data[target == i, 1],
                        c=c, label=label)
         plt.legend()
         plt.savefig('Reduced_PCA_Graph')

    # Classifying the data using a Linear SVM and predicting the probability of disease belonging to a particular class
    modelSVM = LinearSVC(C=0.001)
    pca = PCA(n_components=5, whiten=True).fit(X)
    X_new = pca.transform(X)

    # calling plot_2D
    target_names = ['0','1','2','3','4']
    plot_2D(X_new, y, target_names)

    #Applying cross validation on the training and test set for validating our Linear SVM Model
    X_train, X_test, y_train, y_test = cross_validation.train_test_split(X_new, y, test_size=0.4, train_size=0.6, random_state=0)
    modelSVM = modelSVM.fit(X_train, y_train)
    print("Testing  Linear SVC values using Split")
    print(modelSVM.score(X_test, y_test))

    # prediction score based on X_new
    modelSVMRaw = LinearSVC(C=0.001)
    modelSVMRaw = modelSVMRaw.fit(X_new, y)
    cnt = 0
    for i in modelSVMRaw.predict(X_new):
        if i == y[i]:
           cnt = cnt+1
    print("Score without any split")
    print(float(cnt)/303)


    # printing the Likelihood of disease belonging to a particular class
    # predicting the outcome
    count0 = 0
    count1 = 0
    count2 = 0
    count3 = 0
    count4 = 0
    for i in modelSVM.predict(X_new):
            if i == 0:
                    count0 = count0+1;
            elif i == 1:
                    count1 = count1+1;
            elif i == 2:
                    count2 = count2+1;
            elif i == 3:
                    count3 = count3+1;
            elif modelSVM.predict(i) ==4:
                    count4 = count4+1
    total = count0+count1+count2+count3+count4
    #Predicting the Likelihood
    print("The prediction is as follows:")
    print(" Likelihood of belonging to Class 0 is", float(count0)/total)
    print(" Likelihood of belonging to Class 1 is", float(count1)/total)
    print(" Likelihood of belonging to Class 2 is", float(count2)/total)
    print(" Likelihood of belonging to Class 3 is", float(count3)/total)
    print(" Likelihood of belonging to Class 4 is", float(count4)/total)


    #Applying the Principal Component Analysis on the data features
    modelSVM2 = SVC(C=0.001,kernel='rbf')

    #Applying cross validation on the training and test set for validating our Linear SVM Model
    X_train1, X_test1, y_train1, y_test1 = cross_validation.train_test_split(X_new, y, test_size=0.4, train_size=0.6, random_state=0)
    modelSVM2 = modelSVM2.fit(X_train1, y_train1)
    print("Testing with RBF using split")
    print(modelSVM2.score(X_test1, y_test1))

    modelSVM2Raw = SVC(C=0.001,kernel='rbf')
    modelSVM2Raw = modelSVM2Raw.fit(X_new, y)
    cnt1 = 0
    for i in modelSVM2Raw.predict(X_new):
            if i == y[i]:
               cnt1 = cnt1+1
    print("RBF Score without split")
    print(float(cnt1)/303)
    #Using Stratified K Fold
    skf = cross_validation.StratifiedKFold(y, n_folds=5)
    for train_index, test_index in skf:
       # print("TRAIN:", train_index, "TEST:", test_index)
        X_train3, X_test3 = X[train_index], X[test_index]
        y_train3, y_test3 = y[train_index], y[test_index]
    modelSVM3 = SVC(C=0.001,kernel='rbf')
    modelSVM3 = modelSVM3.fit(X_train3, y_train3)
    print("Testing using stratified with K folds")
    print(modelSVM3.score(X_test3, y_test3))

    modelSVM3Raw = SVC(C=0.001,kernel='rbf')
    modelSVM3Raw = modelSVM3Raw.fit(X_new, y)
    cnt2 = 0
    for i in modelSVM3Raw.predict(X_new):
            if i == y[i]:
               cnt2 = cnt2+1
    print("Stratified K Fold score on X_New")
    print(float(cnt2)/303)

    fig.savefig('plot.pdf')

    def HandleQuestion(self):
        pic = QtGui.QLabel(self)
        pic.setPixmap(QtGui.QPixmap("Reduced_PCA_Graph.png"))

        pic.show() # You were missing this.

        self.lbl3.move(0,190)
        self.SketchPad.resize(250,80)
        self.SketchPad.move(0,220)

Если эта программа была выполнена, она генерирует график рассеяния на консоли проекта. Теперь я хочу, чтобы график рассеяния находился в окне PyQt. Какой лучший способ сделать это?

1 Ответ

0 голосов
/ 18 января 2019

( Сопровождающий Spyder здесь ) Чтобы получить то, что вам нужно, вам нужны две вещи:

  1. Удалите или прокомментируйте эту строку в своем коде

    matplotlib.use('Agg')
    
  2. Вам необходимо перейти к этому пункту меню в Spyder

    Tools > Preferences > IPython console > Graphics > Graphics backend

    измените параметр с именем Backend с Inline на Automatic, а затем перезапустите Spyder.

...