2017-08-25 86 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'返回一個'PathCollection',它是一個名爲'paths'的屬性,它反過來應該包含關於你的點的信息。如果它的工作原理與條形圖中的Rect一樣,你可以使用一個'dict'來做你的映射,但是這必須經過測試...... –

+0

@ThomasKühn'paths'屬性似乎不是獨特。您可以使用下面答案中提供的示例代碼嘗試它。我使用'print(event.artist._paths)'進行檢查。我想這是因爲只有一個散點圖,所以這可能有助於檢測點擊哪個散點圖。 – 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

感謝您的示例。如果有多個散點圖,而且我需要重新定位兩個或更多個點,那麼如果我可以按名稱檢索點對象並單獨修改它們,則會更容易和直接。顯示隱藏。糾正我,如果我錯了,但似乎matplotlib不以這種方式工作,因爲點是由他們的指數引用。有沒有一種方法讓'pick_event'知道點擊時屬於哪個'scatter'或'PathCollection'? – FatHippo

+0

此示例說明如何在單擊時從一個散點圖重新創建散點的原始顏色,因爲這是我如何理解問題的方式。我不確定「name」是什麼意思,但是如果你願意,你可以肯定地將'event.ind'解釋爲「name」(第一個點名爲'0',第二個名爲'1'等) 。像往常一樣,如果問題中存在*實際問題(你想要達到什麼目的),那麼它會「更容易和直接」,如果你想有兩個散點圖,但問題只有一個,那麼可以肯定的是你沒有得到滿意的答案)。 – ImportanceOfBeingErnest

+0

改變點的顏色只是我將如何使用整個繪圖的點對象的字典的一個例子。我在題目中說明了這個問題,它與重現散點的原始顏色無關。我很欣賞你的例子,因爲我從來沒有想過使用色彩地圖來查找原始的顏色。 'event.ind'的問題是,如果我有多個散點圖,除非我可以告訴哪個'scatter'點擊了屬於哪個點,否則它將不起作用。我認爲一個點和他們的名字將解決這個問題。 – FatHippo