Matplotlib slider dan diarsir di bawah grafik
Saya mencoba membuat gambar interaktif dengan penggeser, tetapi saya juga ingin membuat bayangan wilayah di bawah grafik yang saya gambar. Kode berikut (diadaptasi dari plot matplotlib interaktif dengan dua slider ) menghasilkan grafik interaktif:
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()
Yang saya inginkan adalah diarsir di bawah grafik. Jika tidak interaktif maka solusi pada: Bagaimana cara menaungi daerah di bawah kurva di matplotlib bekerja dengan baik (yaitu gunakan ax.fill (X, Y) bukan ax.plot (X, Y)). Namun, dengan interaktivitas saya mendapatkan kesalahan:
"AttributeError: Objek 'Polygon' tidak memiliki atribut 'set_ydata'"
Ada ide bagaimana mencapai ini?
Jawaban
Dalam pyplot, Anda bisa mengisi di bawah kurva menggunakan fill_between. Dengan animasi, hapus data sebelumnya menggunakan fill_betweendengan isian putih.
Ini kode yang diperbarui:
#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()
Keluaran