2016-11-16 50 views
0

我目前正試圖在我的代碼中實現「縮放」功能。我的意思是我希望並排放置兩個子圖,其中一個包含初始數據,另一個包含由用戶輸入決定的「放大」圖。用用戶輸入更新存在的Matplotlib子圖

目前,我可以並排創建兩個子圖,但在調用用戶輸入之後,而不是更新第二個子圖,我的腳本正在創建一個全新的圖,下面沒有更新第二個子圖。首先繪製包含data的圖表非常重要,以便用戶可以相應地選擇輸入的值。

def plot_func(data): 

    plot_this = data 

    plt.close('all') 

    fig = plt.figure() 

    #Subplot 1 
    ax1 = fig.add_subplot(1,2,1) 
    ax1.plot(plot_this) 
    plt.show() 

    zoom = input("Where would you like to zoom to:) 
    zoom_in = plot_this[0:int(zoom)] 

    #Subplot 2 
    ax2 = fig.add_subplot(1,2,2) 
    ax2.plot(zoom_in) 

    plt.show() 

上面的代碼是什麼,我希望做的簡化版本。顯示一個子圖,並基於該子圖,讓用戶輸入一個輸入。然後編輯已經創建的子圖或者創建一個與第一個相鄰的新圖。同樣重要的是,'放大'的小節與第一個反對的下邊並排。

+0

您是否知道已經有了(http://matplotlib.org/users/navigation_toolbar.html)來實現通常的matplotlib繪製窗口中的[縮放工具]? – ImportanceOfBeingErnest

+0

我沒有!感謝您的鏈接。儘管我並沒有試圖實際放大,而是試圖繪製與自身平行的更大數據集的一部分。也許縮放是不正確的詞。 – neerbasu

+0

所以,也許你正在尋找[這樣的事情](http://gtk3-matplotlib-cookbook.readthedocs.io/en/latest/zooming.html)? – ImportanceOfBeingErnest

回答

0

我認爲用戶輸入數字進行縮放並不是很方便。更爲標準的方式是由各種matplotlib tools提供的鼠標交互。

有用於在不同的情節變焦沒有標準的工具,但是我們可以很容易地提供與顯示在下面的代碼使用matplotlib.widgets.RectangleSelector此功能。

我們需要在兩個子圖中繪製相同的數據,並將RectangleSelector連接到其中一個子圖(ax)。每次進行選擇時,第一個子圖中的選擇的數據座標都被簡單地用作第二個子圖的軸限制,有效地證明放大(或放大)功能。

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


def onselect(eclick, erelease): 
    #http://matplotlib.org/api/widgets_api.html 
    xlim = np.sort(np.array([erelease.xdata,eclick.xdata ])) 
    ylim = np.sort(np.array([erelease.ydata,eclick.ydata ])) 
    ax2.set_xlim(xlim) 
    ax2.set_ylim(ylim) 

def toggle_selector(event): 
    # press escape to return to non-zoomed plot 
    if event.key in ['escape'] and toggle_selector.RS.active: 
     ax2.set_xlim(ax.get_xlim()) 
     ax2.set_ylim(ax.get_ylim()) 


x = np.arange(100)/(100.)*7.*np.pi 
y = np.sin(x)**2 

fig = plt.figure() 
ax = fig.add_subplot(121) 
ax2 = fig.add_subplot(122) 

#plot identical data in both axes 
ax.plot(x,y, lw=2) 
ax.plot([5,14,21],[.3,.6,.1], marker="s", color="red", ls="none") 
ax2.plot(x,y, lw=2) 
ax2.plot([5,14,21],[.3,.6,.1], marker="s", color="red", ls="none") 

ax.set_title("Select region with your mouse.\nPress escape to deactivate zoom") 
ax2.set_title("Zoomed Plot") 

toggle_selector.RS = RectangleSelector(ax, onselect, drawtype='box', interactive=True) 
fig.canvas.mpl_connect('key_press_event', toggle_selector) 

plt.show() 

enter image description here

+0

這是一個了不起的工具,謝謝你!我測試了它,它完美地工作。我確實有一個問題,那就是我正在Jupyter Notebook中運行我的腳本,這就是爲什麼我對用戶輸入法感興趣的原因。是否有可能在筆記本電腦中允許此功能? – neerbasu

+0

@neerbasu事實上,你想使用jupyter筆記本是應該在問題中添加的重要信息。我從來沒有使用jupyter,但是不是關於筆記本的全部故事,用戶可以直接輸入任何值,直接輸入代碼?爲什麼你需要'輸入'呢?我也懷疑我的上面的互動示例在jupyter中不起作用。 – ImportanceOfBeingErnest

+0

你是對的,我很抱歉,在看到它是一個關鍵因素之前我沒有提到它。我很抱歉。好消息是,我確實發現了一些代碼,可以使用與前面提到的相同的功能。 – neerbasu

0
%matplotlib inline 
import mpld3 
mpld3.enable_notebook() 
+1

你需要提供一些最低限度的信息,這3條線對於你的問題的答案有多遠。有人如何來到這個網站根本不明白這些線的意思和把它們放在哪裏。 – ImportanceOfBeingErnest