質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

matplotlibを用いた、グラフの作成について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 96

score 6

前提・実現したいこと

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() #グラフの描画

次の図はコンソールのスクリーンショットになります。
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

    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")


↓ 修正

    if(i==11 or i==12 or i==13 or i==22 or i==25 or i==26 or i==39):
        plt.plot(t[i,0], t[i,1], color = "blue", marker='.')
    else:
        plt.plot(t[i,0], t[i,1], color = "red", marker='.')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る