2017-09-26 26 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),不需要列表。 –

相关问题