2016-03-21 5 views
0

kann mir jemand helfen, Punkte in einem 2D-Array colourpot Ich zeichne mit imshow() von Matplotlib. fand ich zwei Beispiele, die das lasso oder LassoSelector von matplotlib mit: http://matplotlib.org/examples/widgets/lasso_selector_demo.html http://matplotlib.org/examples/event_handling/lasso_demo.htmlWählen Sie Punkte in Python imshow() Plot mit Lasso oder Lassomanager

Leider kann ich sie nicht mit imshow für mich funktioniert und 2d (typischerweise 50x500) Array. Die Beispiele funktionieren gut, aber wenn man imshow benutzt, beschwert sich Python über Dinge, die nicht in der Lage sind, eine Farbe zu setzen. Ich bin noch ziemlich neu bei Python. Von was ich verstehe, muss ich eine Sammlung von den Daten bekommen, die ich zur Imshow sende? Unten ist ein Beispiel Code, der nicht funktioniert - ich habe versucht, mit beiden oben genannten Beispielen, ohne Erfolg. Es wäre toll, wenn mir jemand in die richtige Richtung zeigen könnte, obwohl es mir auch nichts ausmacht Code:) Danke.

import numpy as np 
import matplotlib.pyplot as plt 
# use random sample data: 
random_data = np.random.rand(5, 5) 
fig, ax = plt.subplots() 
# Need the plot data as collection to be used with the lasso? 
pts = ax.add_collection(imshow(data, aspect='auto', origin='lower',picker=True),autolim=False) 
data = [Datum(*xy) for xy in random_data] 
lman = ps.LassoManager(ax, data) 

Hier ist der Code aus Beispiel oben verlinkten:

from matplotlib.widgets import Lasso 
from matplotlib.colors import colorConverter 
from matplotlib.collections import RegularPolyCollection 
from matplotlib import path 

import matplotlib.pyplot as plt 
from numpy import nonzero 
from numpy.random import rand 


class Datum(object): 
    colorin = colorConverter.to_rgba('red') 
    colorout = colorConverter.to_rgba('blue') 

    def __init__(self, x, y, include=False): 
     self.x = x 
     self.y = y 
     if include: 
      self.color = self.colorin 
     else: 
      self.color = self.colorout 


class LassoManager(object): 
    def __init__(self, ax, data): 
     self.axes = ax 
     self.canvas = ax.figure.canvas 
     self.data = data 

     self.Nxy = len(data) 

#  facecolors = [d.color for d in data] 
     self.xys = [(d.x, d.y) for d in data] 
     self.ind = [] 
     fig = ax.figure 
     self.collection = RegularPolyCollection(
      fig.dpi, 6, sizes=(100,), 
      facecolors=facecolors, 
      offsets=self.xys, 
      transOffset=ax.transData) 

     ax.add_collection(self.collection) 

     self.cid = self.canvas.mpl_connect('button_press_event', self.onpress) 

    def callback(self, verts): 
     facecolors = self.collection.get_facecolors() 
     p = path.Path(verts) 
     ind = p.contains_points(self.xys) 
     self.ind = nonzero([p.contains_point(xy) for xy in self.xys])[0] 
     for i in range(len(self.xys)): 
      if ind[i]: 
       facecolors[i] = colorConverter.to_rgba('red') 
#    print ind 
      else: 
       facecolors[i] = colorConverter.to_rgba('blue') 

     self.canvas.draw_idle() 
     self.canvas.widgetlock.release(self.lasso) 
     del self.lasso 

    def onpress(self, event): 
     if self.canvas.widgetlock.locked(): 
      return 
     if event.inaxes is None: 
      return 
     self.lasso = Lasso(event.inaxes, 
          (event.xdata, event.ydata), 
          self.callback) 
     # acquire a lock on the widget drawing 
     self.canvas.widgetlock(self.lasso) 

if __name__ == '__main__': 
    print 'test' 

    data = [Datum(*xy) for xy in rand(5, 5)] 

    ax = plt.axes(xlim=(0, 1), ylim=(0, 1), autoscale_on=False) 
    lman = LassoManager(ax, data) 

    plt.show() 

    for i in lman.ind: 
     print lman.xys[i] 

    print len(lman.xys) 

Edit: Das folgende Beispiel funktioniert für mich aus einem 2D-Plot beliebig geformten Bereiche zu wählen (nicht streuen oder XY-Diagramm). Nicht schön noch elegant, aber das kann warten:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.widgets import LassoSelector 
from matplotlib.path import Path 


data = np.random.rand(10, 5) 
grid = np.indices(data.shape) 

ax = plt.subplot(111) 
ax.pcolormesh(data) 
ind = [] 

def onselect(verts): 
    global ind 
# print verts 
    pp = Path(verts) 
    grid = [(i,j) for j in xrange(int(data.shape[0])) for i in xrange(int(data.shape[0]))] 
    ii = np.nonzero([pp.contains_point(xy) for xy in grid]) 
    ind = [grid[i] for i in ii[0]] 

# ind = pp.contains_points(grid) 
# print ind 
lasso = LassoSelector(ax, onselect) 

plt.draw() 
plt.show() 

print ind 
+0

Meinen Sie Sie zu interagieren und die Daten raus wie: http : //stackoverflow.com/questions/33231120/interaction-with-pythons-matplotlib-figure-assign-value-to-selected-features/33231600#33231600 – Chiel

+0

Danke, das wies mich in die richtige Richtung (was zu gehen war Zurück zur grundlegenden Onselect-Funktion in Lasso anstelle von Demo-Beispielen). Ich möchte willkürliche/unregelmäßige Formen auswählen, also habe ich mit dem Lasso-Widget geklebt, oben Beispiel hinzugefügt. – Seb

Antwort

0

Es gibt Dinge, die Sie nicht in Ihrem Code definiert haben. Aber in jedem Fall das ein Funktionsbeispiel ist mit, was Sie haben:

from matplotlib.widgets import Lasso 
from matplotlib.colors import colorConverter 
from matplotlib.collections import RegularPolyCollection 
from matplotlib import path 

import matplotlib.pyplot as plt 
from numpy import nonzero 
from numpy.random import rand 

class Datum(object): 
    colorin = colorConverter.to_rgba('red') 
    colorout = colorConverter.to_rgba('blue') 

    def __init__(self, x, y, include=False): 
     self.x = x 
     self.y = y 
     if include: 
      self.color = self.colorin 
     else: 
      self.color = self.colorout 


class LassoManager(object): 
    def __init__(self, ax, data): 
     self.axes = ax 
     self.canvas = ax.figure.canvas 
     self.data = data 

     self.Nxy = len(data) 

     facecolors = [d.color for d in data] 
     self.xys = [(d.x, d.y) for d in data] 
     self.ind = [] 
     fig = ax.figure 
     self.collection = RegularPolyCollection(
      fig.dpi, 6, sizes=(100,), 
      facecolors=facecolors, 
      offsets=self.xys, 
      transOffset=ax.transData) 

     ax.add_collection(self.collection) 

     self.cid = self.canvas.mpl_connect('button_press_event', self.onpress) 

    def callback(self, verts): 
     facecolors = self.collection.get_facecolors() 
     p = path.Path(verts) 
     ind = p.contains_points(self.xys) 
     self.ind = nonzero([p.contains_point(xy) for xy in self.xys])[0] 
     for i in range(len(self.xys)): 
      if ind[i]: 
       facecolors[i] = colorConverter.to_rgba('red') 
#    print ind 
      else: 
       facecolors[i] = colorConverter.to_rgba('blue') 

     self.canvas.draw_idle() 
     self.canvas.widgetlock.release(self.lasso) 
     del self.lasso 

    def onpress(self, event): 
     if self.canvas.widgetlock.locked(): 
      return 
     if event.inaxes is None: 
      return 
     self.lasso = Lasso(event.inaxes, 
          (event.xdata, event.ydata), 
          self.callback) 
     # acquire a lock on the widget drawing 
     self.canvas.widgetlock(self.lasso) 

data = np.random.rand(5, 5) 
fig, ax = plt.subplots() 
# No, no need for collection 
ax.imshow(data, aspect='auto', origin='lower',picker=True) 
data = [Datum(*xy) for xy in rand(10, 2)] 
lman = LassoManager(ax, data) 
plt.show() 

, hier ist das Ergebnis:

enter image description here

+0

Danke für die Hilfe. Leider war ich in meiner Frage nicht klar genug und vermasselte die Definition der Daten, die ich darstellen möchte. Das Beispiel arbeitet mit Array 102 (normales Scatter, xy-Diagramm), aber meine Daten sind ein 2d-Farbdiagramm. Wenn ich Daten z. 5x5, ich kann das Datum nicht mehr erstellen, daher funktioniert das Beispiel nicht. – Seb

+0

Das hat nichts mit der Handlung zu tun. Die Datum-Definition hat in ihrer Definition x und y (zwei Variablen). Wenn Sie "Daten" machen, also 5x5, geben Sie 5 Variablen in Datum ein. Es wird also ein Fehler angezeigt. – armatita

+0

Sie haben Recht, es ist nicht wirklich ein Plotten Problem, eher die Datenstruktur der Beispiele, die ich gefunden habe. – Seb

Verwandte Themen