首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python "ginput“可以独立于”缩放到矩形“吗?

Python "ginput“可以独立于”缩放到矩形“吗?
EN

Stack Overflow用户
提问于 2015-03-19 13:24:40
回答 3查看 2.2K关注 0票数 3

我正在使用ginput的图形选择几个点沿时间信号。有时,当信号太密集时,在选择点之前放大一个区域可能是有用的。我的问题是,zoom to rectangle选项似乎在ginput中得到了考虑。

例如,使用此示例代码:

代码语言:javascript
复制
from __future__ import print_function
from pylab import arange, plot, sin, ginput, show
import numpy as np

t = np.linspace(0,25,500)
plot(t, sin(t))
x = ginput(3)
print("clicked",x)
show()

如果我放大了信号的一部分,为缩放区域选择所做的点击将在ginput.有没有办法避免这种情况,并使缩放区域的选择独立于ginput

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-20 14:08:29

由于我没有得到任何答案,而且我在这个主题上找不到什么,下面是我如何解决这个问题的方法:我添加了一个预过程,允许用户放大所选区域。当该区域适合采摘点时,用户只需按下"Enter“就可以继续使用ginput

代码语言:javascript
复制
from __future__ import print_function
from pylab import arange, plot, sin, ginput, show
import matplotlib as plt  
from pylab import *
import numpy as np

def closest_point(vec,val):
    ind = np.where(vec==min(vec,key=lambda x:abs(x-val)))
    return ind[0][0]

t = np.linspace(0,250,5000)
y = sin(t)

fig = plt.figure()
plt.suptitle('chosing points over a possibly dense signal...',fontsize=14)
zoom_ok = False
while not zoom_ok:
    plt.plot(t,y)
    plt.title('1 - click on the two corners of the area to enlarge',fontsize=12)
    zoom = ginput(2,timeout=-1)
    xzoom = np.zeros([0])
    for i in range(2):
        xzoom = np.concatenate((xzoom,[int(closest_point(t,zoom[i][0]))]))  
    temps_zoom = t[xzoom[0]:xzoom[1]]
    dep_zoom = y[xzoom[0]:xzoom[1]]
    plt.clf()
    plt.plot(temps_zoom,dep_zoom,'b')
    plt.title('2 - if zoom ok -> press Enter, otherwise -> mouse click',fontsize=12)
    zoom_ok = plt.waitforbuttonpress()
plt.title('3 - you may now select the points ',fontsize=16)
x = ginput(2,timeout=-1)
plt.show()  
票数 1
EN

Stack Overflow用户

发布于 2017-11-04 22:32:52

我有同样的问题,我的解决办法是编写一个函数,用鼠标轮缩放,这样我就可以不用点击就可以缩放。我从这个页面上得到了这个函数:

Matplotlib plot zooming with scroll wheel

并修改了函数,使其不超过原来的x和y限制:

代码语言:javascript
复制
def zoom_factory(ax, max_xlim, max_ylim, base_scale = 2.):
    def zoom_fun(event):
        # get the current x and y limits
        cur_xlim = ax.get_xlim()
        cur_ylim = ax.get_ylim()
        xdata = event.xdata # get event x location
        ydata = event.ydata # get event y location
        if event.button == 'up':
            # deal with zoom in
            scale_factor = 1/base_scale
            x_scale = scale_factor / 2
        elif event.button == 'down':
            # deal with zoom out
            scale_factor = base_scale
            x_scale = scale_factor * 2
        else:
            # deal with something that should never happen
            scale_factor = 1
            print(event.button)
        # set new limits
        new_width = (cur_xlim[1] - cur_xlim[0]) * x_scale
        new_height = (cur_ylim[1] - cur_ylim[0]) * scale_factor

        relx = (cur_xlim[1] - xdata) / (cur_xlim[1] - cur_xlim[0])
        rely = (cur_ylim[1] - ydata) / (cur_ylim[1] - cur_ylim[0])

        if xdata - new_width * (1 - relx) > max_xlim[0]:
            x_min = xdata - new_width * (1 - relx)
        else:
            x_min = max_xlim[0]
        if xdata + new_width * (relx) < max_xlim[1]:
            x_max = xdata + new_width * (relx)
        else:
            x_max = max_xlim[1]
        if ydata - new_height * (1 - rely) > max_ylim[0]:
            y_min = ydata - new_height * (1 - rely)
        else:
            y_min = max_ylim[0]
        if ydata + new_height * (rely) < max_ylim[1]:
            y_max = ydata + new_height * (rely)
        else:
            y_max = max_ylim[1]
        ax.set_xlim([x_min, x_max])
        ax.set_ylim([y_min, y_max])
        ax.figure.canvas.draw()

    fig = ax.get_figure() # get the figure of interest
    # attach the call back
    fig.canvas.mpl_connect('scroll_event',zoom_fun)

    #return the function
    return zoom_fun

因此,对于给定的数字:

代码语言:javascript
复制
t = np.linspace(0,250,5000)
y = sin(t)    

fig = figure()
ax = fig.add_subplot(111)
plt.plot(t,y)

max_xlim = ax.get_xlim() # get current x_limits to set max zoom out
max_ylim = ax.get_ylim() # get current y_limits to set max zoom out
f = zoom_factory(ax, max_xlim, max_ylim, base_scale=1.1)
show()

x = ginput(3)
票数 3
EN

Stack Overflow用户

发布于 2021-05-18 20:41:19

我使用的解决方法是将鼠标按钮参数设置为None

代码语言:javascript
复制
plt.ginput(n=0, timeout=0, mouse_add=None, mouse_pop=None, mouse_stop=None)

然后,我使用键盘添加/弹出/停止。(若要添加点,请移动鼠标以纠正位置,并按Spacebarj等。使用Delete移除最后一点,使用Enter停止。)这样,当我使用矩形缩放与我的鼠标,我没有多余的点。

当然,您可能尝试的一些键盘键可能有其他与窗口/缩放相关的副作用。(例如,Backspace会弹出并重置缩放),所以您必须小心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29145821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档