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

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

ただいまの
回答率

91.37%

  • Python 2.7

    928questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • NumPy

    233questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

  • pandas

    202questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

  • Matplotlib

    137questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

pythonで散布図の点と元データを関連付けをしたい

解決済

回答 1

投稿 2017/12/05 21:14

  • 評価
  • クリップ 1
  • VIEW 94

実現したいこと

1.png 220     190     192     194     195
2.png 165     143     144     145     146
3.png 179     179     176     169     169
4.png 166     143     145     145     146
5.png 164     142     143     144     145

画像の名前と画像をマトリクス化したcsvを用意し、1.pngがグラフ上のどこにプロットされているか、分かるにようにしたい
**
matplotlibで出力した散布図の点とcsvの元データと関連付ける方法を探しています。
**
・csvのデータが散布図上のどこにあるか簡単に分かる方法
・それを行うためのコード
をご教授お願いします。

(例)・散布図とは別に(画像の名前,x,y)と出力
・散布図のプロットにマウスを近づけると画像の名前が表示される

現状

100枚の画像をマトリクス化したもののみが格納してあるcsvを取り込み、主成分分析をかけて散布図に出力。

# coding:utf-8

import numpy as np
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

#csvを取り込み 
users = np.genfromtxt('/home/srl/mimamori1/b1/pca121.csv',dtype=None, delimiter=",")
colors=['blue','red']
cmap = ListedColormap(colors)
#PCA
pca = PCA(n_components=2)
users_r = pca.fit_transform(users)

#グラフにプロット 
plt.figure()
ccode=[1]*50+[2]*50
plt.scatter(users_r[:,0],users_r[:,1],alpha=0.5,c=ccode,cmap=cmap)
plt.xlabel('pc1')
plt.ylabel('pc2')

plt.show()


pca121.csvの中は横80×40マス、縦が100マス
1行が画像1枚分のデータです。数値のみが格納されています。

220     190     192     194     195
165     143     144     145     146
179     179     176     169     169
166     143     145     145     146
164     142     143     144     145

試したこと

散布図の各要素に文字をつけるを参考に点一つ一つに文字を付けて見たのですが、今後10万以上のデータを扱うので文字だらけになってしまうこちらの手法は自分のプロジェクトに馴染まないと判断しました。大量のデータの中でも一つ一つを区別できる方法がないものかと、ご教授お願いしたく質問するに至りました。

補足情報(言語/FW/ツール等のバージョンなど)

python2.7 ,lunux

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • KojiDoi

    2017/12/06 01:10

    10万以上のデータとは、解析対象の画像が10万枚という意味と理解していいのでしょうか?

    キャンセル

  • tetuwan28emon

    2017/12/06 16:02

    そうゆうことです。テストとしてpca121.csvを使用しており、本命は12万枚の画像データが格納してあるcsvファイルの処理をしたいと思っています。

    キャンセル

回答 1

checkベストアンサー

+4

・散布図のプロットにマウスを近づけると画像の名前が表示される

を実現するための簡単な例を提示します。
マウスカーソルを点に近づけると、その点に紐づいた内容を表示します。
カーソル上に複数の点が重なっていると、全ての点の内容を表示するため、1点のみの内容を表示したい場合は、虫眼鏡機能で画面を拡大表示してください。

参考:Possible to make labels appear when hovering over a point in matplotlib?

import matplotlib.pyplot as plt
import numpy as np

PT_CNT = 50

# データ生成
np.random.seed(1)
x = np.random.rand(PT_CNT)
y = np.random.rand(PT_CNT)
names = np.array( ["pt%d"%i for i in range(PT_CNT)])
c = np.random.randint(1,5,size=PT_CNT)

# 散布図の生成
fig,ax = plt.subplots()
sc = plt.scatter(x,y,c=c, s=100, cmap=plt.cm.RdYlGn, norm=plt.Normalize(1,4))

# アノテーション生成
annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points", arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)

# アノテーション表示更新
def update_annot(ind):

    pos = sc.get_offsets()[ind["ind"][0]]
    annot.xy = pos
    text = "{}, {}".format(" ".join(list(map(str,ind["ind"]))), 
                           " ".join([names[n] for n in ind["ind"]]))
    annot.set_text(text)

# hoverイベント
def hover(event):
    vis = annot.get_visible()
    if event.inaxes == ax and event.button is None: # 上下移動や虫眼鏡のドラッグ中は探さない
        cont, ind = sc.contains(event)
        if cont:
            update_annot(ind)
            annot.set_visible(True)
            fig.canvas.draw_idle()
        else:
            if vis:
                annot.set_visible(False)
                fig.canvas.draw_idle()

# hoverイベントを追加
fig.canvas.mpl_connect("motion_notify_event", hover)

plt.show()


イメージ説明

投稿 2017/12/06 09:37

編集 2017/12/06 17:28

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/06 11:27

    これですね
    https://matplotlib.org/users/event_handling.html
    初めて知りました。
    MaousEventの他に KeyEventやResizeEventなんかも取れるんですね。
    おもしろそうなので、ちょっと遊んでみようと思います。

    キャンセル

  • 2017/12/06 11:35

    私も今回初めて知りました。
    図表ベースの簡易的なGUIアプリならmatplotlibだけでできそうですね。

    キャンセル

  • 2017/12/06 17:39

    matplotlibにこんな機能があったとは、眼から鱗でした。can110さんのコードを参考に、実装できるようがんばりたいと思います。

    キャンセル

  • 2017/12/06 18:39

    色々なイベントあって使いこなすのは難しそうですが、簡単な動作から試しに作ってみるとよいかと思います。がんばってください。

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

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

  • Python 2.7

    928questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • NumPy

    233questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

  • pandas

    202questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

  • Matplotlib

    137questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。