2012-01-25 14 views
7

Mam aplikację, w której mam jedną figurę z dziewięcioma liniowymi sub-działkami (3x3) i chcę, aby użytkownik wybrał jeden z wykresów i ma małą aplikację Python wx do edycji i powiększania podanej działki.Matplotlib: Przechwytuj pojedynczy podplat z wielu podplotów

Czy można pobrać wszystkie informacje z wybranej działki, tj. Etykiety osi, formatowanie osi, linie, rozmiary znaczników, etykiety zaznaczania itp. I szybko narysować je na kanwie aplikacji WX?

Moje bieżące rozwiązanie jest zbyt długie i nieporęczne, ponieważ po prostu ponownie rysuję wykres wybrany przez użytkownika. Myślałem o czymś takim, ale to nie działa dobrze.

#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() 

Czy istnieje sposób, aby zapisać właściwości z getp (AX) do zmiennej i używać wybranych właściwości tej zmiennej z SETP (AX) w celu skonstruowania nowego wykresu? Czuję te dane muszą być dostępne w jakiś sposób, biorąc pod uwagę jak szybko drukuje podczas rozmowy getp (topór), ale nie mogę nawet uzyskać następujący kod do pracy na osi y z dwóch osiach:

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

Mam przeczucie, że nie jest to możliwe, ale myślałem, że o to zapytam.

Odpowiedz

4

Niestety, klonowanie osi lub dzielenie się artystami między wieloma osiami jest trudne w matplotlib. (Nie jest to całkowicie niemożliwe, ale ponowne wykonanie fabuły będzie prostsze.)

Co jednak z poniższym opisem?

Po lewej kliknij na poletko, będzie zajmować całą postać, a po kliknięciu prawym przyciskiem myszy, będziesz „pomniejszyć”, aby pokazać resztę wątków ...

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

Zgadywałem, że jeśli odpowiedź nie jest łatwa do znalezienia, prawdopodobnie istnieje trudne rozwiązanie. Dzięki za ten pomysł; jest to z pewnością kolejna droga do wypróbowania. – hotshotiguana

+0

Podoba mi się ten pomysł, jednak istnieje problem z przywróceniem oryginalnego układu w ostatnich wersjach matplotlib. Powiększona działka nie wraca do pierwotnego rozmiaru. – languitar

+0

@languitar - Działa to dobrze dla mnie z 'v1.4.3'. (Zauważ, że przykład jest obecnie napisany, aby powrócić do pierwotnego rozmiaru tylko za pomocą prawego kliknięcia, a nie innego kliknięcia lewym przyciskiem). Jakie problemy napotykasz? –

Powiązane problemy