Python 使用matplotlib滑块更新等高线打印级别

Python 使用matplotlib滑块更新等高线打印级别,python,user-interface,matplotlib,widget,Python,User Interface,Matplotlib,Widget,我正在尝试使用滑块更改matplotlib填充的等高线图上的颜色级别值。i、 e轮廓f(x,y,z,np.linspace(a,b,n)),其中滑块将控制a和b,并在移动滑块时更改打印颜色级别。 下面的代码获取列格式的数据,将其转换为contourf所需的格式,然后实现滑块。 这就是我尝试过的: import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import Slider data=np.gen

我正在尝试使用滑块更改matplotlib填充的等高线图上的颜色级别值。i、 e轮廓f(x,y,z,np.linspace(a,b,n)),其中滑块将控制a和b,并在移动滑块时更改打印颜色级别。 下面的代码获取列格式的数据,将其转换为contourf所需的格式,然后实现滑块。 这就是我尝试过的:

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

data=np.genfromtxt('file.dat',skip_header=1)
len=np.sqrt(data[:,0].size)
x=np.reshape(data[:,0],(len,len))       
y=np.reshape(data[:,1],(len,len))
z=np.reshape(data[:,3],(len,len))

l=plt.contourf(x,y,z,np.linspace(0,100,255))

axmax = plt.axes([0.25, 0.1, 0.65, 0.03])  #slider location and size
axmin  = plt.axes([0.25, 0.15, 0.65, 0.03])
smax = Slider(axmax, 'Max',0, 100, 50)      #slider properties
smin = Slider(axmin, 'Min', 0, 100, 0)

def update(val):
    l.levels(np.linspace(smin.val,smax.val,255))#changing levels of plot
    fig.canvas.draw_idle()                      #line that throws error
smax.on_changed(update)
smin.on_changed(update)

plt.show()
移动滑块时会引发大量matplotlib错误,相关的滑块为“TypeError:'numpy.ndarray'对象不可调用”,这是由行引发的

fig.canvas.draw_idle()

问题是
l.levels
是一个数组,因此必须更改此数组中的值。在我的测试中,更改这些值不会导致绘图更新。因此,另一个解决方案是清除轴并重新绘制绘图

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

data=np.random.random([25,4])
data = data*100
len=np.sqrt(data[:,0].size)
x=np.reshape(data[:,0],(len,len))       
y=np.reshape(data[:,1],(len,len))
z=np.reshape(data[:,3],(len,len))

l=plt.contourf(x,y,z,np.linspace(0,100,255))
contour_axis = plt.gca()

axmax = plt.axes([0.25, 0.1, 0.65, 0.03])  #slider location and size
axmin  = plt.axes([0.25, 0.15, 0.65, 0.03])
smax = Slider(axmax, 'Max',0, 100, 50)      #slider properties
smin = Slider(axmin, 'Min', 0, 100, 0)


def update(val):
    contour_axis.clear()
    contour_axis.contourf(x,y,z,np.linspace(smin.val,smax.val,255))
    plt.draw()                   
smax.on_changed(update)
smin.on_changed(update)

plt.show()

无花果从哪里来?