Mit matplotlib Slider-Widget, um den Clim im Bild zu ändern

Ich habe praktisch keine Erfahrung mit Python, aber ich versuche, ein einfaches Skript zu erstellen, das ein Bild lädt und das Slider-Widget verwendet, um das Minimum und Maximum der Farbleiste anzupassen und die Bilddaten entsprechend neu zu zeichnen.

Ich versuche, diesem Beispiel zu folgen: http://matplotlib.sourceforge.net/examples/widgets/slider_demo.html . Ich habe versucht, nur den Plot-Befehl zu ändern, um zu zeigen, und die Schieberegler-Werte zu verwenden, um den Clim meines Bildes zu setzen. Allerdings bekomme ich folgende Fehlermeldung aus dem Aufruf 'im1, = ax.imshow' (auf Zeile 12 im Code unten):

'AxesImage' Objekt ist nicht lesbar

Ich verstehe nicht, was dieser Anruf macht, aber anscheinend kann er nicht mit imshow () verwendet werden. Wenn ich das Komma in diesem Anruf lösche, bekomme ich keine Fehler, aber das Bild wird nicht aktualisiert, wenn die Schieberegler geändert werden. Hat jemand eine alternative Lösung oder eine Erklärung dafür, warum das nicht funktioniert? Jede mögliche Hilfe würde geschätzt, danke.

Mein Code ist wie folgt:

from pylab import * from matplotlib.widgets import Slider, Button, RadioButtons import matplotlib.pyplot as plt import numpy as np close('all') ax = subplot(111) subplots_adjust(left=0.25, bottom=0.25) min0 = 0 max0 = 25000 im=np.loadtxt('im.txt') im1,=ax.imshow(im) colorbar() axcolor = 'lightgoldenrodyellow' axmin = axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) axmax = axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) smin = Slider(axmin, 'Min', 0, 30000, valinit=min0) smax = Slider(axmax, 'Max', 0, 30000, valinit=max0) def update(val): im1.set_clim=(smin.val,smax.val) draw() smin.on_changed(update) smax.on_changed(update) show() 

  • Eingebettetes interaktives matplotlib-Plot in einer Webseite
  • Reihenfolge der Indizes in einem Numpy multidimensionalen Array
  • Zwei verschiedene Farb-Farbmaps in der gleichen implow matplotlib
  • Führen Sie Python-Skript in IPython mit Inline / Embedded-Plots
  • Matplotlib Plot Array Größe Limit?
  • Füge Echtzeit-Kanalanzeige zu PyQt hinzu
  • 2 Solutions collect form web for “Mit matplotlib Slider-Widget, um den Clim im Bild zu ändern”

    Meistens hatten Sie nur viele und viele Syntaxprobleme.

    Zum Beispiel haben Sie versucht, einen einzelnen Wert im1,=ax.imshow(im) ( im1,=ax.imshow(im) ), der Ihnen den TypeError gibt, den Sie in Ihrer Frage erwähnt haben (wie es sollte). Sie setzen auch eine Funktion auf einen Wert, wenn Sie es nennen im1.set_clim=(smin.val,smax.val) : ( im1.set_clim=(smin.val,smax.val) ).

    Außerdem habe ich den from pylab import * aus deinem Beispiel entfernt. Dies ist gut für interaktive Nutzung, aber bitte, bitte, bitte verwenden Sie es nicht für tatsächlichen Code. Es macht es sehr schwierig zu sagen, woher die Funktionen, von denen du anrufest, kommen (und der Pylab-Namespace ist vor allem von Design groß und sollte nur für interaktive Nutzung oder schnelle Einmal-Skripte verwendet werden.)

    Hier ist ein Arbeitsbeispiel (mit zufälligen Daten):

     import matplotlib.pyplot as plt import numpy as np from matplotlib.widgets import Slider, Button, RadioButtons fig = plt.figure() ax = fig.add_subplot(111) fig.subplots_adjust(left=0.25, bottom=0.25) min0 = 0 max0 = 25000 im = max0 * np.random.random((10,10)) im1 = ax.imshow(im) fig.colorbar(im1) axcolor = 'lightgoldenrodyellow' axmin = fig.add_axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) axmax = fig.add_axes([0.25, 0.15, 0.65, 0.03], axisbg=axcolor) smin = Slider(axmin, 'Min', 0, 30000, valinit=min0) smax = Slider(axmax, 'Max', 0, 30000, valinit=max0) def update(val): im1.set_clim([smin.val,smax.val]) fig.canvas.draw() smin.on_changed(update) smax.on_changed(update) plt.show() 

    Nach der Dokumentation gibt imshow ein Objekt "matplotlib.image.AxesImage" zurück. Wenn du in dieses Komma eingehst, geht Python davon aus, dass der Rückgabetyp der Funktion etwas iterable sein wird (normalerweise ein Tupel, wenn du diese Konstruktion verwenden würdest, aber nicht unbedingt), denn Python lässt dich so schreiben wie folgt:

     a = my_function() # a = (c, d) a, b = my_function() # a = c, b = d 

    aber

     a, = my_function() # you should get an error 

    Ich bin mir nicht ganz sicher, was Python im1 ohne zu überprüfen (aber aus deiner Frage bekomme ich den Eindruck, dass das Schreiben im1,=... funktioniert, während im1=... nicht), aber ich vermute, dass du es im1=... Zeichne das Bild aus irgendeinem Grund. Wird das update eigentlich angerufen? Wenn es tut, vielleicht versuchen Sie im1.draw() stattdessen.

    Python ist die beste Programmiersprache der Welt.