2016-04-22 80 views
1

我正面臨的問題是,當我使用滑塊增加/減少數值時,我無法弄清楚如何更新數字。使用滑塊均勻間隔更新網格值

我正在創建一個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() 
+0

我看不到代碼中的一個問題。設置滑塊的所有元素都在那裏(座標軸,滑塊,更新函數,on_changed事件,顯示)。在新的Ipython/Jupyter筆記本電腦中使用ipywidgets中的滑塊非常簡單。那會好嗎?你也可以想出一個不依賴於'SimPEG',只是'numpy'的例子嗎?這個問題可能是'np.around',順便說一句。嘗試'np.around(sx,decimals = 1)'。 – roadrunner66

+0

'np.around(sx) - > ..(sx.val)'我認爲 – roadrunner66

+0

看着這更多我認爲我的問題可能是什麼定義L爲。我把sx.val和sy.val放在np.around中。讓我看看如果沒有SimPEG,我可以變出一些東西,但如果你有matplotlib,numpy,scipy和cython,使用pip/git添加SimPEG非常簡單。 – user1332577

回答

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

+1

如果他們更容易,我會有興趣使用ipywidgets/jupyter。我嘗試安裝它們並得到以下錯誤:traitlets.traitlets.TraitError:Comm實例的'內核'特性必須是內核,但指定了'NoneType'類型的值(即None)。任何想法可能是什麼問題? – user1332577

+0

還沒有看到。所以你用'ipython notebook'或'jupyter notebook'啓動筆記本,你會看到網頁,對嗎?你在什麼時候得到錯誤?難道說,進口numpy聲明工作? – roadrunner66

+0

如果我在終端鍵入jupiter筆記本,我會看到網頁。我可以拉起腳本,但我不知道如何從筆記本上運行它。當我在終端中鍵入python script.py時,出現內核錯誤。 – user1332577