2017-06-29 28 views
2

Ich schrieb den folgenden Code, ich möchte, dass wenn ich den Schieberegler bewegen, der Text in der Figur entsprechend geändert, was bedeutet, den vorherigen Text zu entfernen, und die neuen gelesenen Werte aus einer Textliste und in der Lage sein, dies vor und zurück zu tun. Nach einer Bewegung auf dem Schieberegler werden die Texte jedoch überlagert und nicht entfernt. Ich brauche Hilfe zu diesem Problem, wie kann ich den gezeichneten Text ändern, während ich den Schieberegler bewege? Beachten Sie, dass sich die Farben der gezeichneten Quadrate problemlos ihren Werten entsprechend ändern.Python - Text in Figur Plot mit Schieberegler ändern

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

a = np.random.randint(10, size = 4) 
b = np.random.randint(10, size = 4) 
c = np.random.randint(10, size = 4) 
d = np.random.randint(10, size = 4) 

grid = ((a,b),(c,d)) 
grid = np.array(grid) 

fig = plt.figure(figsize=(7,5)) 
ax = fig.add_subplot(111) 
subplots_adjust(left=0.15, bottom=0.25) 

words = ['Sample1', 'Sample2'] 

data_start = 0.5 
dataSlider_ax = fig.add_axes([0.15, 0.1, 0.7, 0.05]) 
dataSlider = Slider(dataSlider_ax, 'value', 0, 1, valinit=data_start) 

def update(val): 
    ref = int(dataSlider.val)  
    print (ref) 
    ax.imshow(grid[ref], interpolation ='none', aspect = 'auto') 
    for (j,i),label in np.ndenumerate(grid[ref]):  
     text = ax.text(i,j,words[ref]) 
#  I uncomment the following line, in case I wanted to plot the values of the arrays 
#  text = ax.text(i,j,grid[ref][j][i]) 

dataSlider.on_changed(update)  
pyplot.show() 

textSlider1 textSlider2

+0

Sie wird auf die Text Glyphen zu halten und sie entfernen, wenn das Überschreiben. https://stackoverflow.com/a/26006851/1562285 –

Antwort

1

Verwenden der set_text Methode auf dem durch text zurückgegebene Objekt. Auch wenn sich das Bild scheinbar gut ändert, weisen Sie immer mehr Objekte zu und zeichnen sie übereinander, und Sie können set_data verwenden, um das Bild mit weniger Speicherzuweisung zu ändern. Hier ist ein modifiziertes Beispiel (ich den Regler Wert von 2, um die Multiplikation Änderungen zu sehen, wenn Sie den Schieberegler bewegt):

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

a, b, c, d = [np.random.randint(10, size = 4) for _ in range(4)] 
grid = ((a,b),(c,d)) 
grid = np.array(grid) 

fig = plt.figure(figsize=(7,5)) 
ax = fig.add_subplot(111) 
plt.subplots_adjust(left=0.15, bottom=0.25) 

words = ['Sample1', 'Sample2'] 

data_start = 0.5 
dataSlider_ax = fig.add_axes([0.15, 0.1, 0.7, 0.05]) 
dataSlider = Slider(dataSlider_ax, 'value', 0, 1, valinit=data_start) 

image = ax.imshow(grid[0], interpolation='none', aspect='auto') 
texts = [[ax.text(i,j,words[0]) 
      for i in range(grid.shape[2])] 
     for j in range(grid.shape[1])] 

def update(val): 
    global image, texts 
    ref = int(dataSlider.val * 2)  
    print (ref) 
    image.set_data(grid[ref]) 
    for (j,i),label in np.ndenumerate(grid[ref]): 
     texts[j][i].set_text(words[ref]) 
    print(ax.get_children()) # if this list keeps getting longer, you are leaking objects 

dataSlider.on_changed(update)  
pyplot.show() 
+0

@Danke für Ihre Antwort Jouni. Ich weiß nicht, ob dies in StackOverflow richtig ist, um nach weiteren Details im selben Thema zu fragen, aber ich habe versucht, dies mit 'tkinter' anzuwenden, allerdings wurde das' image' nicht aktualisiert. Wie könnte dies mit 'tkinter' umgesetzt werden? – philippos