2016-11-18 6 views
0

Ich habe mehrere Funktionen auswählen, die ax eine verschiedene Sammlungen in Achse plotten:Wie aus mehreren Sammlungen in Matplotlib

def my_scatter(ax, ...): 
    pc = ax.scatter(...) 

def plot(ax, ...): 
    lc = mpl.collections.LineCollection(...) 
    ax.add_collection(lc) 

Nun, würde Ich mag einen Picker zu jedem von ihnen hinzuzufügen, so dass schließlich für Bei jeder Sammlung wird eine Funktion plus Index des ausgewählten Sammelelements aufgerufen. Pseudo-codierte dies würde etwas in folgendem Sinne umsetzen:

def example_pick_fct1(idx): 
    ... 

def example_pick_fct2(idx): 
    ... 

def my_scatter(ax, pickfct, ...): 
    pc = ax.scatter(...) 
    pc.add_pickfct(pickfct) 

def my_lines(ax, pickfct, ...): 
    lc = mpl.collections.LineCollection(...) 
    ax.add_collection(lc) 
    lc.add_pickfct(pickfct) 

my_scatter(ax, example_pick_fct1, ...) 
my_scatter(ax, example_pick_fct2, ...) 
my_lines(ax, example_pick_fct2, ...) 

ich einen Blick in die Dokumentation hatte, aber ich derzeit keine gute Strategie sehen, wie es zu implementieren. Kann jemand einen Rat geben? (Noch einmal, das Beispiel ist wirklich Pseudo-Code und ich bin völlig offen für jede nette Lösung mit der gleichen Funktionalität.)

Antwort

0

Ihr Pseudocode ist eigentlich in Ordnung. Es ist einfach nicht möglich, dem Künstler eine Auswahlfunktion direkt hinzuzufügen. Stattdessen können Sie eine globale Auswahl anwenden, die dann auswählt, welche Funktion aufgerufen werden soll. Dies kann durch vorheriges Hinzufügen der Karten (Künstler -> Funktion) zu einem häufig verwendeten Wörterbuch gesteuert werden. Je nachdem, welcher Künstler das Ereignis auslöst, kann die jeweilige Funktion aufgerufen werden.

Hier ist ein Code, der es tut, genau nach Ihrem Beispielcode:

import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.colors import colorConverter 
import numpy as np 


a1 = np.random.rand(16,2) 
a2 = np.random.rand(16,2) 
a3 = np.random.rand(5,6,2) 

# Create a pickermap dictionary that stores 
# which function should be called for which artist 
pickermap = {} 
def add_to_picker_map(artist, func): 
    if func != None: 
     pickermap.update({artist:func}) 


def example_pick_fct1(event): 
    print "You clicked example_pick_fct1\n\ton", event.artist 

def example_pick_fct2(event): 
    print "You clicked example_pick_fct2\n\ton", event.artist 

def my_scatter(ax, pickfct=None): 
    pc = ax.scatter(a2[:,0], a2[:,1], picker=5) 
    # add the artist to the pickermap 
    add_to_picker_map(pc, pickfct) 

def my_lines(ax, pickfct=None): 
    lc = matplotlib.collections.LineCollection(a3, picker=5, colors=[colorConverter.to_rgba(i) for i in 'bgrcmyk']) 
    ax.add_collection(lc) 
    # add the artist to the pickermap 
    add_to_picker_map(lc, pickfct) 

def onpick(event): 
    # if the artist that triggered the event is in the pickermap dictionary 
    # call the function associated with that artist 
    if event.artist in pickermap: 
     pickermap[event.artist](event) 


fig, ax = plt.subplots() 
my_scatter(ax, example_pick_fct1) 
# to register the same artist to two picker functions may not make too much sense, but I leave it here as you were asking for it 
my_scatter(ax, example_pick_fct2) 
my_lines (ax, example_pick_fct1) 

#register the event handler 
fig.canvas.mpl_connect('pick_event', onpick) 

plt.show() 
Verwandte Themen