获取python中鼠标移动的集成路径

时间:2016-03-19 16:56:48

标签: python numpy matplotlib scientific-computing

我目前正在研究一个涉及解决一些二维颂歌的问题。我的问题在于计算用弹簧钩住的测试质量位置到2d电位的测试位置。

我想自定义支持的位置,用我的鼠标在支撑将运行的路径的某个矩形上,最好是绘制在潜在等高线图的顶部。

我是python的新手,并且不知道最好的方法是什么。我正在为这个项目使用numpy和matplotlib,以防它可以使用这些包。

非常感谢。

1 个答案:

答案 0 :(得分:1)

您必须从几个角度思考问题,即绘制等高线图,通过鼠标进行矩形的某种方式,并最终获得有关绘制的矩形的数据。检查以下配方(最后参见我改编的地方):

    import matplotlib.pyplot as plt
    from matplotlib.patches import Rectangle
    import matplotlib.mlab as mlab
    import numpy as np

    class Annotate(object):
        def __init__(self):
            self.ax = plt.gca()

            delta = 0.025
            x = np.arange(-3.0, 3.0, delta)
            y = np.arange(-2.0, 2.0, delta)
            X, Y = np.meshgrid(x, y)
            Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
            Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
            # difference of Gaussians
            Z = 10.0 * (Z2 - Z1)

            CS = plt.contour(X, Y, Z)
            plt.clabel(CS, inline=1, fontsize=10)
            plt.title('Simplest default with labels')

            self.rect = Rectangle((0,0), 1, 1,color=(0,0,1,0.3))
            self.x0 = None
            self.y0 = None
            self.x1 = None
            self.y1 = None
            self.ax.add_patch(self.rect)
            self.ax.figure.canvas.mpl_connect('button_press_event', self.on_press)
            self.ax.figure.canvas.mpl_connect('button_release_event', self.on_release)
            self.ax.set_xlim(-3,3)
            self.ax.set_ylim(-2,2)

        def on_press(self, event):
            print('press')
            self.x0 = event.xdata
            self.y0 = event.ydata

        def on_release(self, event):
            print('release')
            self.x1 = event.xdata
            self.y1 = event.ydata
            self.rect.set_width(self.x1 - self.x0)
            self.rect.set_height(self.y1 - self.y0)
            self.rect.set_xy((self.x0, self.y0))
            print('Rectangle is:','POS:(',self.x1,',',self.y1,') SIZE:(',self.x1 - self.x0,',',self.y1 - self.y0,')')
            self.ax.figure.canvas.draw()

    a = Annotate()
    plt.show()

,此代码将导致:

Rectangle selection over Countour plot

,您可以在其中鼠标绘制一个矩形(透明,以便您看到它下方的内容)。它还会向控制台打印矩形的位置和大小:

 press
 release
 Rectangle is: POS:( 0.967741935484 , -0.449790794979 ) SIZE:( 1.43951612903 , -1.46443514644 )

使用此代码,您可以通过替换(希望)获得您要求的结果。请注意,我已根据以下方法调整了此代码:

Recipe 1 Recipe 2