0

我正在尝试使用滑块来更改颜色缩放的限制,即使用 set_clim(min,max) 函数。我想要它,以便两个滑块控制最小值和最大值的值,并在它们更改后重新绘制图形。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.widgets import Slider, Button

x=np.linspace(0,100,100)
y=np.linspace(0,100,100)
z=np.zeros((100,100))
for i in range (0,100):
    for j in range (0,100):
        z[i,j]=np.random.random()

fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
l=plt.contourf(x,y,z)

axmax = plt.axes([0.25, 0.1, 0.65, 0.03])
axmin  = plt.axes([0.25, 0.15, 0.65, 0.03])

smax = Slider(axmax, 'Max', 0, 1.0, valinit=1)
smin = Slider(axmin, 'Min', 0, 1.0, valinit=0)
def update(val):
    fig.set_clim(smin.val,smax.val)
    fig.canvas.draw_idle()
smax.on_changed(update)
smin.on_changed(update)
plt.show()

当我移动滑块时,上面的代码给了我“AttributeError: 'AxesSubPlot' object has no attribute 'set_clim'”,尽管它确实显示了初始未更改的图形。这是我第一次在 python 中使用小部件(或多或少是我第一次使用 python),所以很可能存在一些非常基本的误解。

4

1 回答 1

3

问题在于错误告诉您,axes对象没有set_clim功能。您想更改(这会使您报告的错误是我期望的错误,但是)

fig.set_clim(smin.val,smax.val)

l.set_clim(smin.val,smax.val)

因为您需要调用set_clim一个ScalarMappable对象(doc)

作为旁注,np.random.random需要大小争论,所以你可以做

z = np.random.random((100, 100))

而不是你的嵌套循环。

于 2013-10-11T16:09:12.617 回答