Blog der Heimetli Software AG

Interaktive Darstellung mit Matplotlib

Es braucht nicht unbedingt Plotly und schon gar nicht Dash für eine interaktive Darstellung mit Python. Matplotlib selber bietet schon Controls wie Buttons und Sliders an.

Was man damit anfangen kann zeigt das folgende GIF:

Animiertes GIF eines Polynoms

Die Slider bestimmen die Parameter des Polynoms und bei jeder Aenderung wird das Diagramm neu gezeichnet.

Das Script

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

def polynom( x, coefficients ):
    result = 0
    factor = 1

    for c in reversed(coefficients):
        result += c * factor
        factor *= x

    return result

fig,ax = plt.subplots()
plt.subplots_adjust( bottom=0.4 )
plt.title("ax³ + bx² + cx + d")
plt.grid( alpha=0.5 )
ax.spines['right'].set_visible( False )
ax.spines['top'].set_visible( False )
ax.set_xlim( -10.2, 10.2 )
ax.set_ylim( -100, 100 )

axsld = plt.axes( [0.1,0.10,0.7,0.03])
axslc = plt.axes( [0.1,0.15,0.7,0.03])
axslb = plt.axes( [0.1,0.20,0.7,0.03])
axsla = plt.axes( [0.1,0.25,0.7,0.03])

sla   = Slider( axsla, "a", -0.1, 0.1,  0 )
slb   = Slider( axslb, "b",   -1,   1,  0 )
slc   = Slider( axslc, "c",  -10,  10, 10 )
sld   = Slider( axsld, "d",  -50,  50,  0 )

coeff = [0,0,10,0]
x     = [n/10 for n in range(-100,100,1)]
y     = [polynom(px,coeff) for px in x]

line, = ax.plot( x, y )

def update( event ):
    coeff[0] = sla.val
    coeff[1] = slb.val
    coeff[2] = slc.val
    coeff[3] = sld.val

    line.set_ydata( [polynom(px,coeff) for px in x] )
    fig.canvas.draw_idle()

sla.on_changed( update )
slb.on_changed( update )
slc.on_changed( update )
sld.on_changed( update )

plt.show()

Ungewöhnlich ist vor allem wie die Flächen für die Slider definiert werden (axsld ... axsla). Die Slider selbst und der Eventhandler sind sehr ähnlich wie bei anderen Frameworks.