Matplotlib-Schieberegler und unter Grafik schattiert
Ich versuche, eine interaktive Figur mit einem Schieberegler zu erstellen, möchte aber auch den Bereich unter dem Diagramm, das ich zeichne, schattieren. Der folgende Code (angepasst aus dem interaktiven Matplotlib-Plot mit zwei Schiebereglern ) erzeugt ein interaktives Diagramm:
import numpy as np
from numpy import pi
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
#Define the function we're graphing
def gaussian(x, sigma):
N = pow(2*pi,-0.5)/sigma
Z = x/sigma
return N*np.exp(-Z*Z/2)
#Default standard deviation of 1
std0=1
#Set up initial default data
X = np.arange(-5,5,0.1)
Y = gaussian(X,std0)
#Create an axis for main graph
fig, ax = plt.subplots(1,1)
ax.set_xlim([-5,5])
ax.set_ylim([0,1])
#[line] will be modified later with new Y values
[line]=ax.plot(X,Y)
#this moves the figure up so that it's not on top of the slider
fig.subplots_adjust(bottom=0.4)
#Create slider
sigma_slider_ax = fig.add_axes([0.25,0.25,0.65,0.03])
sigma_slider = Slider(sigma_slider_ax, 'Standard Deviation', 0.5,2.0,valinit=std0)
#Define what happens when sliders changed
def line_update(val):
Y = gaussian(X,sigma_slider.val)
line.set_ydata(Y)
fig.canvas.draw_idle()
#Call the above function when the slider is changed
sigma_slider.on_changed(line_update)
plt.show()
Ich möchte, dass es unter dem Diagramm schattiert wird. Wenn es nicht interaktiv ist, funktioniert die Lösung unter: So schattieren Sie den Bereich unter der Kurve in matplotlib gut (dh verwenden Sie ax.fill (X, Y), nicht ax.plot (X, Y)). Bei der Interaktivität erhalte ich jedoch eine Fehlermeldung:
"AttributeError: 'Polygon'-Objekt hat kein Attribut' set_ydata '"
Irgendeine Idee, wie man das erreicht?
Antworten
Im Pyplot können Sie mit unter die Kurve füllen fill_between. Löschen Sie bei der Animation die vorherigen Daten fill_betweenmit einer weißen Füllung.
Hier ist der aktualisierte Code:
#Define what happens when sliders changed
def line_update(val):
ax.fill_between([-5,5], [1,1], facecolor='white', alpha=1) # fill white
#ax.fill_between(X, [1 for v in Y], facecolor='white', alpha=1) # fill white
Y = gaussian(X,sigma_slider.val)
line.set_ydata(Y)
ax.fill_between(X, Y, facecolor='blue', alpha=0.30) # fill blue
fig.canvas.draw_idle()
#Call the above function when the slider is changed
sigma_slider.on_changed(line_update)
line_update(0) # fill curve first time
plt.show()
Ausgabe