Matplotlib Slider: Funktionset_val funktioniert nicht nach Standardvorschriften?
Posted: 21 May 2025, 14:24
Ich bin ein Anfänger mit dem Slider -Tool und holte einen Code, der früher funktioniert hat, aber nicht mehr funktioniert. Ich habe hier einen ähnlichen Code gefunden, um das Slider-Tool in dieser Antwort zu testen, das ein in sich geschlossenes Beispiel bietet: < /p>
Wenn ich das auf dieser anderen Seite angegebene Beispiel in meiner Python 3.12.9/Matplotlib 3.10.1 -Umgebung kopiere, erhalte ich einen Fehler:
Zelle in [9], Zeile 47, in Discreteslider.set_val (self)
TypeError: 'tuple' object does not support item assignment
The print command returns :
2 (0, 0.25)
I understand that tuples cannot Modifiziert werden, aber dies sollte vorher funktionieren? Die wenigen Beispiele, die ich im Internet gefunden habe, verwenden immer noch die obige Syntax. Ich verstehe also nicht die Struktur von Self.Poly.xy und ich verstehe nicht, warum das Standardbeispiel nicht funktioniert. Daher kann ich nicht mit ihm spielen, um seine Verwendung zu verstehen ...
Danke für jede Hilfe
Code: Select all
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import Slider
class ChangingPlot(object):
def __init__(self):
self.inc = 0.5
self.fig, self.ax = plt.subplots()
self.sliderax = self.fig.add_axes([0.2, 0.02, 0.6, 0.03],
facecolor='yellow')
self.slider = DiscreteSlider(self.sliderax, 'Value', 0, 10,
increment=self.inc, valinit=self.inc)
self.slider.on_changed(self.update)
x = np.arange(0, 10.5, self.inc)
self.ax.plot(x, x, 'ro')
self.dot, = self.ax.plot(self.inc, self.inc, 'bo', markersize=18)
def update(self, value):
self.dot.set_data([[value],[value]])
self.fig.canvas.draw()
def show(self):
plt.show()
class DiscreteSlider(Slider):
"""A matplotlib slider widget with discrete steps."""
def __init__(self, *args, **kwargs):
"""Identical to Slider.__init__, except for the "increment" kwarg.
"increment" specifies the step size that the slider will be discritized
to."""
self.inc = kwargs.pop('increment', 0.5)
Slider.__init__(self, *args, **kwargs)
self.val = 1
def set_val(self, val):
discrete_val = int(val / self.inc) * self.inc
# We can't just call Slider.set_val(self, discrete_val), because this
# will prevent the slider from updating properly (it will get stuck at
# the first step and not "slide"). Instead, we'll keep track of the
# the continuous value as self.val and pass in the discrete value to
# everything else.
xy = self.poly.xy
xy[2] = discrete_val, 1
xy[3] = discrete_val, 0
self.poly.xy = xy
self.valtext.set_text(self.valfmt % discrete_val)
if self.drawon:
self.ax.figure.canvas.draw()
self.val = val
if not self.eventson:
return
for cid, func in self.observers.items():
func(discrete_val)
p = ChangingPlot()
p.show()
Zelle in [9], Zeile 47, in Discreteslider.set_val (self)
Code: Select all
45 xy = self.poly.xy
46 print(type(self.poly.xy),len(xy),xy)
---> 47 xy[2] = discrete_val, 1
48 xy[3] = discrete_val, 0
49 self.poly.xy = xy
The print command returns :
2 (0, 0.25)
I understand that tuples cannot Modifiziert werden, aber dies sollte vorher funktionieren? Die wenigen Beispiele, die ich im Internet gefunden habe, verwenden immer noch die obige Syntax. Ich verstehe also nicht die Struktur von Self.Poly.xy und ich verstehe nicht, warum das Standardbeispiel nicht funktioniert. Daher kann ich nicht mit ihm spielen, um seine Verwendung zu verstehen ...
Danke für jede Hilfe