2017-08-25 8 views
1

私は今後の操作のために散布図の点を選択できる対話グラフを作成しています。位置を別の点と交換する。ポイントが選択されると、ポイントが選択されたことを示すために黒に変わります。散布図からのラベルとそのポイントオブジェクトの作成

Sample interaction

あり、図中のいくつかの散布図も、各プロットは、各点の元の色を保持するので、独特の色を持っていることが、私はラベル(キー)とそのポイントオブジェクトの辞書を作成する必要があります(値)。ペアリング中に他の値が元の色、XY位置など

を含んここで、単一の散布図だし、イベント関数を選んだ:

self.scatter = self.mplwidget_layout.canvas.ax.scatter(
    y=..., 
    x=..., 
    color=..., 
    edgecolors=..., 
    picker=True 
) 
self.mplwidget_layout.canvas.mpl_connect('pick_event', self.select_point) 

def select_point(self, event): 
    if event.mouseevent.button == 1: 
     facecolor = self.scatter._facecolors[event.ind,:] 

     if (facecolor == np.array([[0, 0, 0, 1]])).all(): 
      # Look up label-object dict 
     else: 
      self.scatter._facecolors[event.ind,:] = (0, 0, 0, 1) 
      self.scatter._edgecolors[event.ind,:] = (1, 1, 1, 1) 

     self.mplwidget_layout.canvas.draw() 
  1. 私は個々のラベルを(割り当てることができないように思え配列内の点)をポイントにマッピングできますが、ラベルにオフセットをマップできます。各ポイントに名前を付けて名前で検索する方法はありますか?

  2. 散布図のポイントオブジェクトのリストにアクセスするにはどうすればよいですか?

ポイントとその割り当てられた名前:

Points and their assigned names

+0

'scatter'は' paths'という名前の属性として 'PathCollection'を返します。これはあなたのポイントに関する情報を含む必要があります。棒グラフの 'Rect'のように機能するなら、' dict'を使ってマッピングを行うことができますが、それはテストする必要があります... –

+0

@ThomasKühn 'paths'属性は存在しないようですユニーク。以下の答えで提供されているサンプルコードを試してみてください。 'print(event.artist._paths)'を使ってチェックしました。私はそれが1つの散布図があるので、これはクリックされた散布図を検出するのに役立つかもしれないからだと思います。 – FatHippo

+0

'_paths'は一意ですが、(get_paths()で取得する方が良い方法で)確認しました。しかし、私があなたの問題を正しく解釈するならば、あなたは同じ座標を使って各サブプロットの点をプロットします。この場合、 '_paths'オブジェクトはそれぞれ* equal *ですが、** *同じではありません(' == 'と' is'の違い)。 –

答えて

0

あなたが色付けするために最初に使用しているevent.indと色のリストを使用してポイントをクリックした後、元の色を取り戻すために、ポイント。私はここに辞書の必要性は全く見当たりません。

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.rand(6) 
y = np.random.rand(6) 

fig, ax = plt.subplots() 
ax.set_facecolor("k") 

fcolor = plt.cm.RdYlBu(x) 
ecolor = ["k"]*6 

scatter = ax.scatter(x,y, s=100, facecolors=fcolor,edgecolors=ecolor , picker=True) 

def select_point(event): 
    if event.mouseevent.button == 1: 
     facecolor = scatter._facecolors[event.ind,:] 

     if (facecolor == np.array([[0, 0, 0, 1]])).all(): 
      scatter._facecolors[event.ind,:] = fcolor[event.ind] 
      scatter._edgecolors[event.ind,:] = (0, 0, 0, 1) 
     else: 
      scatter._facecolors[event.ind,:] = (0, 0, 0, 1) 
      scatter._edgecolors[event.ind,:] = (1, 1, 1, 1) 

     fig.canvas.draw_idle() 

fig.canvas.mpl_connect('pick_event', select_point) 

plt.show() 
+0

ありがとうございます。複数の散布図があり、2つ以上の点を再配置する必要がある場合は、ポイントオブジェクトを名前で取得して個々に変更することができます。表示/非表示。私が間違っている場合は私を修正しますが、matplotlibはポイントがインデックスによって参照されるため、そのようには機能しません。 'pick_event'がクリックされたときにそのポイントが属していた' scatter'や 'PathCollection'を知る方法はありますか? – FatHippo

+0

この例では、クリックしたときに1つのスキャッタプロットからスキャッタポイントの元の色を再作成する方法を示します。私はあなたが "name"で何を意味するのかは分かりませんが、もしあなたが望むならば 'event.ind'を必ず" name "と解釈できます(最初のポイントは' 0'、2番目は '1'など) 。質問に実際に問題がある場合は、いつものように「もっと簡単で簡単」になるでしょう(何を達成しようとしていますか?2つの散布図が必要な場合は質問が1つしかありませんが、あなたは満足のいく答えを得られない)。 – ImportanceOfBeingErnest

+0

ポイントの色を変更することは、プロット全体のポイントオブジェクトの辞書をどのように使うかの例に過ぎません。私はスキャッタポイントの元の色を再現することとは関係のないタイトルの問題を述べました。私は元の色を調べる方法としてカラーマップを使用することは考えていないので、私はあなたの例を高く評価します。 'event.ind'の問題は、複数の散布図がある場合、クリックされた点がどの散布図に属しているかを知ることができないとうまくいかないことです。私はポイントとその名前のdictがこの問題を解決するだろうと考えました。 – FatHippo