Select 点 python imshow() 使用 lasso 或 lassomanager 绘图
Select points in python imshow() plot with lasso or lassomanager
任何人都可以帮助我 select 我正在使用 matplotlib 中的 imshow() 绘制的二维数组色盆中的点。
我从 matplotlib 中找到了两个使用套索或 LassoSelector 的示例:
http://matplotlib.org/examples/widgets/lasso_selector_demo.html
http://matplotlib.org/examples/event_handling/lasso_demo.html
不幸的是,我无法使用 imshow 和 2d(通常为 50x500)数组让它们为我工作。这些示例工作正常,但是在使用 imshow 时,python 抱怨诸如无法设置颜色之类的事情。
我对 python 还是很陌生。据我了解,我必须从发送给 imshow 的数据中获取一个集合?
下面是一些不起作用的示例代码——我尝试了上面链接的两个示例,但没有成功。
如果有人能给我指出正确的方向,那就太好了,尽管我也不介意工作代码:)
谢谢。
import numpy as np
import matplotlib.pyplot as plt
# use random sample data:
random_data = np.random.rand(5, 5)
fig, ax = plt.subplots()
# Need the plot data as collection to be used with the lasso?
pts = ax.add_collection(imshow(data, aspect='auto', origin='lower',picker=True),autolim=False)
data = [Datum(*xy) for xy in random_data]
lman = ps.LassoManager(ax, data)
这里是上面链接示例中的代码:
from matplotlib.widgets import Lasso
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection
from matplotlib import path
import matplotlib.pyplot as plt
from numpy import nonzero
from numpy.random import rand
class Datum(object):
colorin = colorConverter.to_rgba('red')
colorout = colorConverter.to_rgba('blue')
def __init__(self, x, y, include=False):
self.x = x
self.y = y
if include:
self.color = self.colorin
else:
self.color = self.colorout
class LassoManager(object):
def __init__(self, ax, data):
self.axes = ax
self.canvas = ax.figure.canvas
self.data = data
self.Nxy = len(data)
# facecolors = [d.color for d in data]
self.xys = [(d.x, d.y) for d in data]
self.ind = []
fig = ax.figure
self.collection = RegularPolyCollection(
fig.dpi, 6, sizes=(100,),
facecolors=facecolors,
offsets=self.xys,
transOffset=ax.transData)
ax.add_collection(self.collection)
self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)
def callback(self, verts):
facecolors = self.collection.get_facecolors()
p = path.Path(verts)
ind = p.contains_points(self.xys)
self.ind = nonzero([p.contains_point(xy) for xy in self.xys])[0]
for i in range(len(self.xys)):
if ind[i]:
facecolors[i] = colorConverter.to_rgba('red')
# print ind
else:
facecolors[i] = colorConverter.to_rgba('blue')
self.canvas.draw_idle()
self.canvas.widgetlock.release(self.lasso)
del self.lasso
def onpress(self, event):
if self.canvas.widgetlock.locked():
return
if event.inaxes is None:
return
self.lasso = Lasso(event.inaxes,
(event.xdata, event.ydata),
self.callback)
# acquire a lock on the widget drawing
self.canvas.widgetlock(self.lasso)
if __name__ == '__main__':
print 'test'
data = [Datum(*xy) for xy in rand(5, 5)]
ax = plt.axes(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
lman = LassoManager(ax, data)
plt.show()
for i in lman.ind:
print lman.xys[i]
print len(lman.xys)
编辑:下面的示例适用于 select 二维图(不是散点图或 xy 图)中任意形状的区域。不漂亮也不优雅,但可以等待:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import LassoSelector
from matplotlib.path import Path
data = np.random.rand(10, 5)
grid = np.indices(data.shape)
ax = plt.subplot(111)
ax.pcolormesh(data)
ind = []
def onselect(verts):
global ind
# print verts
pp = Path(verts)
grid = [(i,j) for j in xrange(int(data.shape[0])) for i in xrange(int(data.shape[0]))]
ii = np.nonzero([pp.contains_point(xy) for xy in grid])
ind = [grid[i] for i in ii[0]]
# ind = pp.contains_points(grid)
# print ind
lasso = LassoSelector(ax, onselect)
plt.draw()
plt.show()
print ind
您的代码中有些内容尚未定义。但无论如何,这是一个使用您提供的内容的功能示例:
from matplotlib.widgets import Lasso
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection
from matplotlib import path
import matplotlib.pyplot as plt
from numpy import nonzero
from numpy.random import rand
class Datum(object):
colorin = colorConverter.to_rgba('red')
colorout = colorConverter.to_rgba('blue')
def __init__(self, x, y, include=False):
self.x = x
self.y = y
if include:
self.color = self.colorin
else:
self.color = self.colorout
class LassoManager(object):
def __init__(self, ax, data):
self.axes = ax
self.canvas = ax.figure.canvas
self.data = data
self.Nxy = len(data)
facecolors = [d.color for d in data]
self.xys = [(d.x, d.y) for d in data]
self.ind = []
fig = ax.figure
self.collection = RegularPolyCollection(
fig.dpi, 6, sizes=(100,),
facecolors=facecolors,
offsets=self.xys,
transOffset=ax.transData)
ax.add_collection(self.collection)
self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)
def callback(self, verts):
facecolors = self.collection.get_facecolors()
p = path.Path(verts)
ind = p.contains_points(self.xys)
self.ind = nonzero([p.contains_point(xy) for xy in self.xys])[0]
for i in range(len(self.xys)):
if ind[i]:
facecolors[i] = colorConverter.to_rgba('red')
# print ind
else:
facecolors[i] = colorConverter.to_rgba('blue')
self.canvas.draw_idle()
self.canvas.widgetlock.release(self.lasso)
del self.lasso
def onpress(self, event):
if self.canvas.widgetlock.locked():
return
if event.inaxes is None:
return
self.lasso = Lasso(event.inaxes,
(event.xdata, event.ydata),
self.callback)
# acquire a lock on the widget drawing
self.canvas.widgetlock(self.lasso)
data = np.random.rand(5, 5)
fig, ax = plt.subplots()
# No, no need for collection
ax.imshow(data, aspect='auto', origin='lower',picker=True)
data = [Datum(*xy) for xy in rand(10, 2)]
lman = LassoManager(ax, data)
plt.show()
,结果如下:
任何人都可以帮助我 select 我正在使用 matplotlib 中的 imshow() 绘制的二维数组色盆中的点。 我从 matplotlib 中找到了两个使用套索或 LassoSelector 的示例: http://matplotlib.org/examples/widgets/lasso_selector_demo.html http://matplotlib.org/examples/event_handling/lasso_demo.html
不幸的是,我无法使用 imshow 和 2d(通常为 50x500)数组让它们为我工作。这些示例工作正常,但是在使用 imshow 时,python 抱怨诸如无法设置颜色之类的事情。 我对 python 还是很陌生。据我了解,我必须从发送给 imshow 的数据中获取一个集合? 下面是一些不起作用的示例代码——我尝试了上面链接的两个示例,但没有成功。 如果有人能给我指出正确的方向,那就太好了,尽管我也不介意工作代码:) 谢谢。
import numpy as np
import matplotlib.pyplot as plt
# use random sample data:
random_data = np.random.rand(5, 5)
fig, ax = plt.subplots()
# Need the plot data as collection to be used with the lasso?
pts = ax.add_collection(imshow(data, aspect='auto', origin='lower',picker=True),autolim=False)
data = [Datum(*xy) for xy in random_data]
lman = ps.LassoManager(ax, data)
这里是上面链接示例中的代码:
from matplotlib.widgets import Lasso
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection
from matplotlib import path
import matplotlib.pyplot as plt
from numpy import nonzero
from numpy.random import rand
class Datum(object):
colorin = colorConverter.to_rgba('red')
colorout = colorConverter.to_rgba('blue')
def __init__(self, x, y, include=False):
self.x = x
self.y = y
if include:
self.color = self.colorin
else:
self.color = self.colorout
class LassoManager(object):
def __init__(self, ax, data):
self.axes = ax
self.canvas = ax.figure.canvas
self.data = data
self.Nxy = len(data)
# facecolors = [d.color for d in data]
self.xys = [(d.x, d.y) for d in data]
self.ind = []
fig = ax.figure
self.collection = RegularPolyCollection(
fig.dpi, 6, sizes=(100,),
facecolors=facecolors,
offsets=self.xys,
transOffset=ax.transData)
ax.add_collection(self.collection)
self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)
def callback(self, verts):
facecolors = self.collection.get_facecolors()
p = path.Path(verts)
ind = p.contains_points(self.xys)
self.ind = nonzero([p.contains_point(xy) for xy in self.xys])[0]
for i in range(len(self.xys)):
if ind[i]:
facecolors[i] = colorConverter.to_rgba('red')
# print ind
else:
facecolors[i] = colorConverter.to_rgba('blue')
self.canvas.draw_idle()
self.canvas.widgetlock.release(self.lasso)
del self.lasso
def onpress(self, event):
if self.canvas.widgetlock.locked():
return
if event.inaxes is None:
return
self.lasso = Lasso(event.inaxes,
(event.xdata, event.ydata),
self.callback)
# acquire a lock on the widget drawing
self.canvas.widgetlock(self.lasso)
if __name__ == '__main__':
print 'test'
data = [Datum(*xy) for xy in rand(5, 5)]
ax = plt.axes(xlim=(0, 1), ylim=(0, 1), autoscale_on=False)
lman = LassoManager(ax, data)
plt.show()
for i in lman.ind:
print lman.xys[i]
print len(lman.xys)
编辑:下面的示例适用于 select 二维图(不是散点图或 xy 图)中任意形状的区域。不漂亮也不优雅,但可以等待:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import LassoSelector
from matplotlib.path import Path
data = np.random.rand(10, 5)
grid = np.indices(data.shape)
ax = plt.subplot(111)
ax.pcolormesh(data)
ind = []
def onselect(verts):
global ind
# print verts
pp = Path(verts)
grid = [(i,j) for j in xrange(int(data.shape[0])) for i in xrange(int(data.shape[0]))]
ii = np.nonzero([pp.contains_point(xy) for xy in grid])
ind = [grid[i] for i in ii[0]]
# ind = pp.contains_points(grid)
# print ind
lasso = LassoSelector(ax, onselect)
plt.draw()
plt.show()
print ind
您的代码中有些内容尚未定义。但无论如何,这是一个使用您提供的内容的功能示例:
from matplotlib.widgets import Lasso
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection
from matplotlib import path
import matplotlib.pyplot as plt
from numpy import nonzero
from numpy.random import rand
class Datum(object):
colorin = colorConverter.to_rgba('red')
colorout = colorConverter.to_rgba('blue')
def __init__(self, x, y, include=False):
self.x = x
self.y = y
if include:
self.color = self.colorin
else:
self.color = self.colorout
class LassoManager(object):
def __init__(self, ax, data):
self.axes = ax
self.canvas = ax.figure.canvas
self.data = data
self.Nxy = len(data)
facecolors = [d.color for d in data]
self.xys = [(d.x, d.y) for d in data]
self.ind = []
fig = ax.figure
self.collection = RegularPolyCollection(
fig.dpi, 6, sizes=(100,),
facecolors=facecolors,
offsets=self.xys,
transOffset=ax.transData)
ax.add_collection(self.collection)
self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)
def callback(self, verts):
facecolors = self.collection.get_facecolors()
p = path.Path(verts)
ind = p.contains_points(self.xys)
self.ind = nonzero([p.contains_point(xy) for xy in self.xys])[0]
for i in range(len(self.xys)):
if ind[i]:
facecolors[i] = colorConverter.to_rgba('red')
# print ind
else:
facecolors[i] = colorConverter.to_rgba('blue')
self.canvas.draw_idle()
self.canvas.widgetlock.release(self.lasso)
del self.lasso
def onpress(self, event):
if self.canvas.widgetlock.locked():
return
if event.inaxes is None:
return
self.lasso = Lasso(event.inaxes,
(event.xdata, event.ydata),
self.callback)
# acquire a lock on the widget drawing
self.canvas.widgetlock(self.lasso)
data = np.random.rand(5, 5)
fig, ax = plt.subplots()
# No, no need for collection
ax.imshow(data, aspect='auto', origin='lower',picker=True)
data = [Datum(*xy) for xy in rand(10, 2)]
lman = LassoManager(ax, data)
plt.show()
,结果如下: