2017-09-26 101 views
0

同樣,我對Python非常陌生。下面我提供我的代碼(用於特徵選擇的分類),而不是數據,因爲它的維數很高,但我相信這個問題與數據無關。我的問題是雙重的:我想要所有子圖的軸標籤,並且我想知道我可以如何子圖劃分子圖的數量可以不同每行(我有14個子圖,目前在三行中):在python中每行使用不同數量的子圖進行子圖繪製

import matplotlib.pyplot as plt 
from sklearn.svm import SVC 
from sklearn.model_selection import StratifiedKFold 
from sklearn.feature_selection import RFECV 
from sklearn.datasets import make_classification 
from sklearn import preprocessing 
import scipy.io as sio 
import numpy as np 
import os 

allData = sio.loadmat('Alldatav2.mat') 
allFeatures = allData['featuresAll2'] 

# loop over subjects 
n_subject = [0,1,2,3,4,5,6,7,8,9,10,11,12,13] 

fig, axs = plt.subplots(3,5,figsize=(15, 6)) 
plt.xlabel("Number of features selected") 
plt.ylabel("Cross validation score (nb of correct classifications)") 
fig.subplots_adjust() 
axs = axs.ravel() 

for i, j in zip(n_subject, range(15)): 
    #print("For Subject : ", i+1) 
    y = allData['labels'] 
    X = allFeatures[i*120:(i+1)*120,:] 

    svc = SVC(kernel="linear",C=1) 
    rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2), 
       scoring='accuracy') 
    rfecv.fit(X, y.ravel()) 


    axs[j].plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_) 
plt.show() 


# loop over subjects 
def mean(numbers): 
    return float(sum(numbers))/max(len(numbers), 1) 

n_subject = [0,1,2,3,4,5,6,7,8,9,10,11,12,13] 
avg_scores = [] 

for i in n_subject: 
    print("For Subject : ", i+1) 
    y = allData['labels'] 
    X = allFeatures[i*120:(i+1)*120,:] 

    svc = SVC(kernel="linear",C=1) 
    rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(10), 
       scoring='accuracy') 
    rfecv.fit(X, y.ravel()) 
    print("Optimal number of features : %d" % rfecv.n_features_) 
    print("Ranking of Features : ", rfecv.ranking_) 
    avg_score = rfecv.grid_scores_.max() 
    print("Best CV Score : ", avg_score) 
    avg_scores.append(avg_score) 
    print("------------------------------------------") 
print("Average Accuracy over all Subjects : ", mean(avg_scores)) 

回答

1

對於每個子圖的標籤,可以先創建一個包含這些標籤的列表。

xlabelList = [xlabel0, xlabel1 ....,xlabel13] 
ylabelList = [ylabel0, ylabel1,....,ylabel13] 

此外,您不需要爲循環定義額外的變量n_subject。對於繪圖我會做出以下更改:

for j in range(14): 

    #print("For Subject : ", j+1) 
    y = allData['labels'] 
    X = allFeatures[j*120:(j+1)*120,:] 

    svc = SVC(kernel="linear",C=1) 
    rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(2), 
      scoring='accuracy') 
    rfecv.fit(X, y.ravel()) 

    locInd = np.unravel_index(j, (3,5))  
    axs[locInd].plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_) 
    axs[locInd].set_xlabel(xlabelList[j]) 
    axs[locInd].set_ylabel(ylabelList[j]) 
plt.show() 
+0

非常感謝! x和y標籤都是一樣的,我怎麼能重複這個文本14次而不用手動輸入呢?此外,我嘗試(僅用於測試)軸標籤:[a,a,a,a,a,a,a,a,a,a,a,a,a,a],但這看起來無效語法 - 爲什麼? – TestGuest

+0

您的標籤必須是字符串。如果所有的標籤都是相同的,你可以這樣做:axs [locInd] .set_xlabel(xlabel),不需要列表。 –

相關問題