2016-06-23 8 views
1

Hey, ich arbeite an einer Zoomfunktion für ein Projekt, an dem ich gerade arbeite. Normalerweise würde ich nur den Zoom verwenden, der bereits in Plots und was nicht mit Matplotlib zur Verfügung gestellt wird, aber es gibt eine spezielle Möglichkeit, mehrere Bilder gleichzeitig zu analysieren, die der Zoom nicht unterstützt. Ich habe versucht, eine Art Zoom-Funktion zu schreiben, die ein Array aufnehmen und nur die Teile zerschneiden würde, die ich mit imshow() zeigen möchte. Hier ist ein Beispiel dafür, was ich zu tun versucht:Hausgemachter Zoom zeigt falschen Bereich

import matplotlib.pyplot as plt 
from matplotlib.widgets import Button, Slider 
import numpy as np 

arr = np.zeros([100,100]) 
for i in range(0,99): 
    for j in range(0,99): 
     if i % 2 == 0 and j % 2 == 0: 
      arr[i][j] = 10 
     if i % 3 == 0 and j % 3 == 0: 
      arr[i][j] = -7 
plt.figure(1) 
axpic = plt.subplot2grid((1,1),(0,0), rowspan = 1, colspan = 1) 

plt.figure(2) 
ax1 = plt.subplot2grid((5,5),(0,0), rowspan = 1, colspan = 4) 
ax2 = plt.subplot2grid((5,5),(1,0), rowspan = 1, colspan = 4) 
ax3 = plt.subplot2grid((5,5),(2,0), rowspan = 1, colspan = 4) 
ax4 = plt.subplot2grid((5,5),(3,0), rowspan = 1, colspan = 4) 

axbutton = plt.subplot2grid((5,5),(4,4), rowspan = 1, colspan = 1) 

s1 = Slider(ax1, 'Row Begin', 0, 99, valinit=0) 
s2 = Slider(ax2, 'Row End', 0, 99, valinit=99) 
s3 = Slider(ax3, 'Col Begin', 0, 99, valinit=0) 
s4 = Slider(ax4, 'Col End', 0, 99, valinit=99) 

zoom = Button(axbutton, 'Zoom') 

def dat_view_doe(event): 
    if event == 'Nothing': 
     axpic.imshow(arr, cmap = 'RdBu') 
    else: 
     plt.figure(1) 
     axpic.cla() 
     axpic.imshow(arr[int(s1.val):int(s2.val)][int(s3.val):int(s4.val)], cmap = 'RdBu') 
     plt.ylim(0, s2.val-s1.val) 
     plt.xlim(0, s4.val-s3.val) 

zoom.on_clicked(dat_view_doe) 

dat_view_doe('Nothing') 
plt.show() 

Der Zoom zu viele Zeilen wird das Ausschneiden, und keine der Spalten der Bildanordnung Ausschneiden. Ich bin mir nicht sicher, ob es etwas Syntaxmäßiges gibt, das ich falsch mache, oder wenn es ein tieferes Problem gibt. Danke für jede Hilfe.

Antwort

0

Mindestens ein mögliches Problem mit Ihrem Code ist, dass Sie sowohl die arr beim Aufruf von IMshow schneiden als auch die Achsengrenzen ändern (und diese von Null auf Max-Min setzen). Ich würde vorschlagen, einfach die Achse jedes Mal mit dem folgenden Code anzupassen:

import matplotlib.pyplot as plt 
from matplotlib.widgets import Button, Slider 
import numpy as np 

arr = np.zeros([100,100]) 
for i in range(0,99): 
    for j in range(0,99): 
     if i % 2 == 0 and j % 2 == 0: 
      arr[i][j] = 10 
     if i % 3 == 0 and j % 3 == 0: 
      arr[i][j] = -7 
plt.figure(1) 
axpic = plt.subplot2grid((1,1),(0,0), rowspan = 1, colspan = 1) 

plt.figure(2) 
ax1 = plt.subplot2grid((5,5),(0,0), rowspan = 1, colspan = 4) 
ax2 = plt.subplot2grid((5,5),(1,0), rowspan = 1, colspan = 4) 
ax3 = plt.subplot2grid((5,5),(2,0), rowspan = 1, colspan = 4) 
ax4 = plt.subplot2grid((5,5),(3,0), rowspan = 1, colspan = 4) 

axbutton = plt.subplot2grid((5,5),(4,4), rowspan = 1, colspan = 1) 

s1 = Slider(ax1, 'Row Begin', 0, 99, valinit=0) 
s2 = Slider(ax2, 'Row End', 0, 99, valinit=99) 
s3 = Slider(ax3, 'Col Begin', 0, 99, valinit=0) 
s4 = Slider(ax4, 'Col End', 0, 99, valinit=99) 

zoom = Button(axbutton, 'Zoom') 

def dat_view_doe(event): 
    if event == 'Nothing': 
     axpic.imshow(arr, cmap = 'RdBu') 
    else: 
     plt.figure(1) 
     plt.xlim(s1.val, s2.val) 
     plt.ylim(s3.val, s4.val) 
     plt.draw() 

zoom.on_clicked(dat_view_doe) 

dat_view_doe('Nothing') 
plt.show() 
+0

Dies ...... funktioniert viel besser und macht mehr Sinn. Danke Herr. Trollgesicht Herr, der genau das tut, was ich will. Ich wünsche ihnen einen wunderbaren Tag. –

+0

kein Problem, guten Tag auch für Sie :) –

Verwandte Themen