Python 从绘图中选择数据点框

Python 从绘图中选择数据点框,python,numpy,matplotlib,Python,Numpy,Matplotlib,我有一个包含三列的目录,我想在数组中读取它们,并通过从两个不同的图中选择它们来排除目录中的一些数据点。如果我将目录中的列命名为“m”、“rh”和“rg”,我希望通过在“m-rh”图和“m-rg”图中选择不同的框来排除数据点。应该怎么做?我遇到过,但它不会像numpy数组那样返回任何值 任何包含我应该从何处开始或如何开始的帮助都将不胜感激。基本上,您是在询问如何以交互方式选择矩形区域中的点 有一个matplotlib小部件,它将以交互方式为您绘制一个矩形:matplotlib.widgets.Re

我有一个包含三列的目录,我想在数组中读取它们,并通过从两个不同的图中选择它们来排除目录中的一些数据点。如果我将目录中的列命名为“m”、“rh”和“rg”,我希望通过在“m-rh”图和“m-rg”图中选择不同的框来排除数据点。应该怎么做?我遇到过,但它不会像numpy数组那样返回任何值


任何包含我应该从何处开始或如何开始的帮助都将不胜感激。

基本上,您是在询问如何以交互方式选择矩形区域中的点

有一个matplotlib小部件,它将以交互方式为您绘制一个矩形:matplotlib.widgets.RectangleSelector。不过,您需要处理想要对矩形区域执行的操作

作为一个基本示例,让我们以交互方式高亮显示矩形内的点这是一种低效的方法,但我们需要在这个示例的基础上做您想要做的事情。关闭“地物”窗口后,这将打印出未选择的点~在numpy阵列上作为逻辑_not操作:

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

def main():
    x, y = np.random.random((2, 100))
    fig, ax = plt.subplots()
    ax.scatter(x, y, color='black')
    highlighter = Highlighter(ax, x, y)
    plt.show()

    selected_regions = highlighter.mask
    # Print the points _not_ selected
    print x[~selected_regions], y[~selected_regions]

class Highlighter(object):
    def __init__(self, ax, x, y):
        self.ax = ax
        self.canvas = ax.figure.canvas
        self.x, self.y = x, y
        self.mask = np.zeros(x.shape, dtype=bool)

        self._highlight = ax.scatter([], [], s=200, color='yellow', zorder=10)

        self.selector = RectangleSelector(ax, self, useblit=True)

    def __call__(self, event1, event2):
        self.mask |= self.inside(event1, event2)
        xy = np.column_stack([self.x[self.mask], self.y[self.mask]])
        self._highlight.set_offsets(xy)
        self.canvas.draw()

    def inside(self, event1, event2):
        """Returns a boolean mask of the points inside the rectangle defined by
        event1 and event2."""
        # Note: Could use points_inside_poly, as well
        x0, x1 = sorted([event1.xdata, event2.xdata])
        y0, y1 = sorted([event1.ydata, event2.ydata])
        mask = ((self.x > x0) & (self.x < x1) &
                (self.y > y0) & (self.y < y1))
        return mask

main()
但是,由于有两个链接的绘图,因此还有一个褶皱。您希望在X-Y图上进行选择,以同时在X-Z图上进行选择。让我们修改一些东西来处理这个问题:

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

def main():
    x, y, z = np.random.random((3, 100))
    z *= 10
    fig, axes = plt.subplots(figsize=(6, 8), nrows=2, sharex=True)
    axes[0].scatter(x, y, color='black')
    axes[1].scatter(x, z, color='black')
    axes[0].set(ylabel='Y')
    axes[1].set(xlabel='X', ylabel='Y')

    highlighter = Highlighter(axes, x, y, z)
    plt.show()

    selected_regions = highlighter.mask
    print x[~selected_regions], y[~selected_regions], z[~selected_regions]

class Highlighter(object):
    def __init__(self, axes, x, y, z):
        self.axes = axes
        self.canvas = axes[0].figure.canvas
        self.x, self.y, self.z = x, y, z
        self.mask = np.zeros(x.shape, dtype=bool)

        self._highlights = [ax.scatter([], [], s=200, color='yellow', zorder=10)
                               for ax in axes]

        self._select1 = RectangleSelector(axes[0], self.select_xy, useblit=True)
        self._select2 = RectangleSelector(axes[1], self.select_xz, useblit=True)

    def select_xy(self, event1, event2):
        self.mask |= self.inside(event1, event2, self.x, self.y)
        self.update()

    def select_xz(self, event1, event2):
        self.mask |= self.inside(event1, event2, self.x, self.z)
        self.update()

    def update(self):
        xy = np.column_stack([self.x[self.mask], self.y[self.mask]])
        self._highlights[0].set_offsets(xy)

        xz = np.column_stack([self.x[self.mask], self.z[self.mask]])
        self._highlights[1].set_offsets(xz)

        self.canvas.draw()

    def inside(self, event1, event2, x, y):
        x0, x1 = sorted([event1.xdata, event2.xdata])
        y0, y1 = sorted([event1.ydata, event2.ydata])
        return (x > x0) & (x < x1) & (y > y0) & (y < y1)

main()

我知道你想通过Python来实现,但是试试看。在这里你可以加载你的文件,然后打印它们,选择你的子集,然后保存。非常感谢!这正是我想要的。