使用滑块更新均匀间隔网格中的值

时间:2016-04-22 17:42:39

标签: python numpy mesh ipywidgets

我面临的问题是,当我用滑块增加/减少数值时,我无法弄清楚如何更新数字。

我正在创建一个x,y网格,然后绘制它,并更新我的数组中的值以定义一个新的网格。我希望能够移动滑块并查看更精细/更粗糙的网格并更新绘图和轴。

此外,我希望用户能够使用鼠标以交互方式移动网格线。这不包含在示例代码中。有人知道如何实现这个吗?

有一些类似的问题已被问及有关使用滑块更新绘图上的值,但可能没有解决此特定问题;谁能帮助我弄清楚我做错了什么?我意识到我没有重绘绘图的任何东西(尽管我已经测试过各种各样的东西),但我不确定如何实现它,因为M.plotGrid()创建了网格,所以它可能/可能不像使用fig.canvas.draw_idle()。

这是我的代码:

#Create simple evenly spaced mesh and allow slider to change values

from SimPEG import Mesh, np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider, Button, RadioButtons

hx = np.r_[0.1,0.1,0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
hy = np.r_[0.1,0.1,0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]

M = Mesh.TensorMesh([hx, hy])
M.plotGrid()

#Define slider location, size, and color for adjusting mesh values
axhx = plt.axes([0.25, 0.1, 0.65, 0.03])
axhy = plt.axes([0.25, 0.15, 0.65, 0.03])
xnode_inc = Slider(axhx, 'X mesh Node', 0.1, 1000.0, valinit=0)
anode_inc = Slider(axhy, 'Y mesh Node', 0.1, 1000.0, valinit=0)

def update(val):
    framehx = xnode_inc.val + hx
    framehy = ynode_inc.val + hy
    M = Mesh.TensorMesh([framehx, framehy])
    print M, framehx, framehy
    M.plotGrid()

xnode_inc.on_changed(update)
ynode_inc.on_changed(update)

plt.show()

1 个答案:

答案 0 :(得分:1)

我只能举例说明交互式更改numpy网格,因为我不使用SimPEG。这个例子是在Ipython / Jupyter笔记本中。这是迄今为止生成交互式滑块,下拉,无线电按钮等的最简单方法,即与原始matplotlib滑块的类似设置的复杂设置相比有很大改进。为了简单起见,我为色彩映射投入了一个组合框。

import numpy as np
import matplotlib.pyplot as p
from ipywidgets import *
%matplotlib inline


def gridandplot(dx,mp):
    x=np.arange(0,5,dx)
    y=np.arange(0,5,dx)
    x,y=np.meshgrid(x,y)
    z= np.sin(x)* np.cos(y)
    if mp=='gray':
        cmap=p.cm.gray
    else:
        cmap= p.cm.jet
    p.imshow(z,interpolation='none',cmap=cmap)

interact(gridandplot, dx=(0.005,0.2,0.001), mp= ('gray','jet'))

enter image description here

enter image description here