【问题标题】:Select n data points from plot从图中选择 n 个数据点
【发布时间】:2017-10-18 10:53:49
【问题描述】:

我想通过在图中单击 om 来选择点并将点存储在数组中。我想在 n 次选择后停止选择点,例如按下一个键。我怎样才能做到这一点?这是我目前所拥有的。

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click on points')

line, = ax.plot(np.random.rand(100), 'o', picker=5)  # 5 points tolerance

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    ind = event.ind
    points = tuple(zip(xdata[ind], ydata[ind]))
    print('onpick points:', points)


fig.canvas.mpl_connect('pick_event', onpick)

plt.show()

【问题讨论】:

  • 有什么问题? “停止选择”是什么意思? (您可以通过不再选择更多点来停止选择)
  • 我想选择适合直线的点。

标签: python matplotlib interactive


【解决方案1】:

要拥有 GUI 功能,您必须将绘图嵌入到 GUI 框架中;但是,有一种简单的方法可以限制选定项的数量:

import matplotlib
matplotlib.use('TkAgg')

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click on points')

line, = ax.plot(np.random.rand(100), 'o', picker=5)  # 5 points tolerance

points = []
n = 5

def onpick(event):
    if len(points) < n:
        thisline = event.artist
        xdata = thisline.get_xdata()
        ydata = thisline.get_ydata()
        ind = event.ind
        point = tuple(zip(xdata[ind], ydata[ind]))
        points.append(point)
        print('onpick point:', point)
    else:
        print('already have {} points'.format(len(points)))


fig.canvas.mpl_connect('pick_event', onpick)

plt.show()

示例输出:

onpick point: ((54.0, 0.68482963903475647),)
onpick point: ((54.0, 0.68482963903475647),)
onpick point: ((54.0, 0.68482963903475647),)
onpick point: ((54.0, 0.68482963903475647),)
onpick point: ((54.0, 0.68482963903475647),)
already have 5 points

如果要选择唯一点,可以使用集合而不是列表来存储它们。

【讨论】:

  • 如果我想通过选定的点画一条线,如何让 Python 更新绘图?
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多