2012-01-25 13 views
7

Ho un'applicazione in cui ho una figura con nove trame secondarie di trama (3x3) e voglio consentire all'utente di selezionare uno dei grafici e di aprire una piccola applicazione Python wx fino a consentire la modifica e lo zoom sulla sottotrama specificata.Matplotlib: Grab Single Subplot da sottotrammi multipli

È possibile acquisire tutte le informazioni dalla sottotrama selezionata, ossia le etichette degli assi, la formattazione degli assi, le linee, le dimensioni delle zecche, le etichette delle tacche, ecc. E tracciarle rapidamente sulla tela dell'applicazione wx?

La mia soluzione attuale è troppo lunga e ingombrante, come ho appena rifare la trama che l'utente seleziona. Stavo pensando qualcosa del genere, ma non funziona abbastanza bene.

#ax is a dictionary containing each instance of the axis sub-plot 
selected_ax = ax[6] 
wx_fig = plt.figure(**kwargs) 
ax = wx_fig.add_subplots(111) 
ax = selected_ax 
plt.show() 

C'è un modo per salvare le proprietà da getp (Ax) a una variabile e utilizzare le proprietà selezionate di quella variabile con setp (ax) per la costruzione di un nuovo grafico? Mi sento questi dati deve essere accessibile in qualche modo, data la rapidità con la stampa quando si chiama getp (ax), ma non riesco nemmeno a ottenere il seguente codice per lavorare su un asse con due assi Y:

label = ax1.yaxis.get_label() 
ax2.yaxis.set_label(label) 

Ho la sensazione che questo non sia possibile, ma ho pensato di chiedere comunque.

risposta

4

Sfortunatamente, la clonazione di un asse o la condivisione di artisti tra più assi è difficile in matplotlib. (Non completamente impossibile, ma rifare la trama sarà più semplice.)

Tuttavia, che dire di qualcosa come il seguente?

Quando sei partito click su una sottotrama, occuperà l'intera figura, e quando si fa clic, si "zoom out" per mostrare al resto delle sottotrame ...

import matplotlib.pyplot as plt 

def main(): 
    fig, axes = plt.subplots(nrows=2, ncols=2) 
    for ax, color in zip(axes.flat, ['r', 'g', 'b', 'c']): 
     ax.plot(range(10), color=color) 
    fig.canvas.mpl_connect('button_press_event', on_click) 
    plt.show() 

def on_click(event): 
    """Enlarge or restore the selected axis.""" 
    ax = event.inaxes 
    if ax is None: 
     # Occurs when a region not in an axis is clicked... 
     return 
    if event.button is 1: 
     # On left click, zoom the selected axes 
     ax._orig_position = ax.get_position() 
     ax.set_position([0.1, 0.1, 0.85, 0.85]) 
     for axis in event.canvas.figure.axes: 
      # Hide all the other axes... 
      if axis is not ax: 
       axis.set_visible(False) 
    elif event.button is 3: 
     # On right click, restore the axes 
     try: 
      ax.set_position(ax._orig_position) 
      for axis in event.canvas.figure.axes: 
       axis.set_visible(True) 
     except AttributeError: 
      # If we haven't zoomed, ignore... 
      pass 
    else: 
     # No need to re-draw the canvas if it's not a left or right click 
     return 
    event.canvas.draw() 

main() 
+0

Immagino che se la risposta non fosse facile da trovare, probabilmente c'era una soluzione difficile. Grazie per questa idea; è certamente un'altra strada da provare. – hotshotiguana

+0

Mi piace questa idea, tuttavia, c'è un problema con il ripristino del layout originale nelle recenti versioni di matplotlib. Il grafico ingrandito non torna alle dimensioni originali. – languitar

+0

@languitar - Funziona bene con 'v1.4.3'. (Si noti che l'esempio è attualmente scritto per tornare alla sua dimensione originale solo con un clic destro, non con un altro clic con il tasto sinistro.) Quali problemi si stanno verificando? –