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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

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

NumPy

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

Python 2.7

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

pandas

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

Q&A

解決済

1回答

2607閲覧

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

tetuwan28emon

総合スコア15

Matplotlib

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

NumPy

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

Python 2.7

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

pandas

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

1グッド

3クリップ

投稿2017/12/05 12:14

###実現したいこと

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

sswaka👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2017/12/05 16:10

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

2017/12/06 07:02

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

回答1

0

ベストアンサー

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

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

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

Python

1import matplotlib.pyplot as plt 2import numpy as np 3 4PT_CNT = 50 5 6# データ生成 7np.random.seed(1) 8x = np.random.rand(PT_CNT) 9y = np.random.rand(PT_CNT) 10names = np.array( ["pt%d"%i for i in range(PT_CNT)]) 11c = np.random.randint(1,5,size=PT_CNT) 12 13# 散布図の生成 14fig,ax = plt.subplots() 15sc = plt.scatter(x,y,c=c, s=100, cmap=plt.cm.RdYlGn, norm=plt.Normalize(1,4)) 16 17# アノテーション生成 18annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points", arrowprops=dict(arrowstyle="->")) 19annot.set_visible(False) 20 21# アノテーション表示更新 22def update_annot(ind): 23 24 pos = sc.get_offsets()[ind["ind"][0]] 25 annot.xy = pos 26 text = "{}, {}".format(" ".join(list(map(str,ind["ind"]))), 27 " ".join([names[n] for n in ind["ind"]])) 28 annot.set_text(text) 29 30# hoverイベント 31def hover(event): 32 vis = annot.get_visible() 33 if event.inaxes == ax and event.button is None: # 上下移動や虫眼鏡のドラッグ中は探さない 34 cont, ind = sc.contains(event) 35 if cont: 36 update_annot(ind) 37 annot.set_visible(True) 38 fig.canvas.draw_idle() 39 else: 40 if vis: 41 annot.set_visible(False) 42 fig.canvas.draw_idle() 43 44# hoverイベントを追加 45fig.canvas.mpl_connect("motion_notify_event", hover) 46 47plt.show()

イメージ説明

投稿2017/12/06 00:37

編集2017/12/06 08:28
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/12/06 02:35

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

2017/12/06 08:39

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

2017/12/06 09:39

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問