使用滑块更新均匀分布的网格中的值
Update values in evenly spaced mesh with slider
我面临的问题是,当我使用滑块设置 increase/decrease 值时,我无法弄清楚如何更新图形。
我正在创建一个 x, y 网格,然后绘制它,并更新我的数组中的值以定义一个新网格。我希望能够移动滑块并查看 finer/coarser 网格并更新绘图和轴。
此外,我希望用户能够使用鼠标以交互方式移动网格线。这不包括在示例代码中。有人知道如何实现吗?
关于使用滑块更新图上的值,也有类似的问题,但也许 none 解决了这个特定问题;有人可以帮我弄清楚我做错了什么吗?我意识到我没有任何重绘情节的东西(尽管我已经测试了各种东西),但我不确定如何实现它,因为 M.plotGrid() 创建了网格,所以它 may/may 没有就像使用 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()
我只能举一个交互式改变 numpy
网格的例子,因为我不使用 SimPEG
。该示例位于 Ipython/Jupyter 笔记本中。这是迄今为止生成交互式滑块、下拉菜单、单选按钮等的最简单方法,即与原始 matplotlib 滑块的类似设置的复杂设置相比有了很大改进。为了简单起见,我为颜色图添加了 combo-box。
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'))
我面临的问题是,当我使用滑块设置 increase/decrease 值时,我无法弄清楚如何更新图形。
我正在创建一个 x, y 网格,然后绘制它,并更新我的数组中的值以定义一个新网格。我希望能够移动滑块并查看 finer/coarser 网格并更新绘图和轴。
此外,我希望用户能够使用鼠标以交互方式移动网格线。这不包括在示例代码中。有人知道如何实现吗?
关于使用滑块更新图上的值,也有类似的问题,但也许 none 解决了这个特定问题;有人可以帮我弄清楚我做错了什么吗?我意识到我没有任何重绘情节的东西(尽管我已经测试了各种东西),但我不确定如何实现它,因为 M.plotGrid() 创建了网格,所以它 may/may 没有就像使用 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()
我只能举一个交互式改变 numpy
网格的例子,因为我不使用 SimPEG
。该示例位于 Ipython/Jupyter 笔记本中。这是迄今为止生成交互式滑块、下拉菜单、单选按钮等的最简单方法,即与原始 matplotlib 滑块的类似设置的复杂设置相比有了很大改进。为了简单起见,我为颜色图添加了 combo-box。
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'))