前提・実現したいこと
matplotlibを用いて、主成分得点の第1主成分要素と第2主成分要素からグラフを作りたい。その際、特定のサンプルについては他のサンプルと色を変えてプロットしたい。
発生している問題・エラーメッセージ
グラフにplotされなくて困っています。初歩的な質問かもしれませんが、力を貸していただきたいです。
該当のソースコード
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt D=np.loadtxt('PLIliveJ.dat',skiprows=1,) D=D[:,[6,12,16,17,18,21,22]] print(D) #データの標準化 parameta_number=D.shape[1] data_number=D.shape[0] Ds=np.zeros((parameta_number,data_number)) Ds=Ds.tolist() for i in range(parameta_number): Dd=D[:,i:i+1] mean=np.average(Dd) std=np.std(Dd) for j in range(data_number): Dd[j]=(Dd[j]-mean)/std Ds[i][j]=Dd[j] Ds=np.array(Ds) Ds=Ds.T Ds=Ds[0] print("標準化されたデータ行列") print(Ds) #特異値分解を実施 u,w,vt = np.linalg.svd(Ds,full_matrices=False) #u,w,vtを出力 print("u") print(u) print("w") print(w) print("v") print(vt.T) #寄与率 conr=np.array([]) for i in range(len(w)): conr=np.append(conr,np.array([w[i]*w[i]/u.shape[0]])) conr=conr.reshape([len(w),1]) conr=conr[:,0].tolist() print("寄与率") print(conr) #累積寄与率 d=np.cumsum(conr) print("累積寄与率") print(d) #因子負荷量 def consum(conr,v,w): consum=np.array([]) for i in range(len(w)): consum=np.append(consum,np.array([np.sqrt(conr[i])*v[:,i]])) consum = consum.reshape([len(w),len(v)]) consum=consum.T return consum print("因子負荷量") v=vt.T print(consum(conr,v,w)) #主成分得点 print("主成分得点") t=D@v print("t") print(t) tsize=t.shape[0] #第一主成分と第二主成分をプロットする plt.figure(figsize=(6, 6)) for i in range(tsize): if(i==11 or 12 or 13 or 22 or 25 or 26 or 39): plt.plot(t[i,0], t[i,1], color = "blue") else: plt.plot(t[i,0], t[i,1], color = "red") plt.grid() plt.xlabel("PC1") plt.ylabel("PC2") plt.show() #累積寄与率のグラフ left = np.arange(len(d)) # 横軸のデータ height = np.array(d/len(d)) # 縦軸のデータ plt.figure() plt.bar(left, height, align="center", width=0.5) # 棒グラフを作成 y_line = 0.8 # 補助線のレベル plt.axhline(y_line, linestyle='dashed') #補助線を書き込む plt.xlabel('Number of principal components') # xlabel関数:横軸のラベル plt.ylabel('Cumulative contribution rate') # ylabel関数:縦軸のラベル plt.show() #グラフの描画
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。