Найти - Пользователи
Полная версия: matplotlib и lasso - выделение точек
Начало » GUI » matplotlib и lasso - выделение точек
1
Konstantin91
Здравствуйте.

Задча стоит такая, есть массив данных (X,Y) (генерируется не случайно) его нужно построить и иметь возможность выделять точки на графике

нашел следующий код:
from matplotlib.widgets import Lasso
import matplotlib.mlab
from matplotlib.nxutils import points_inside_poly
from matplotlib.colors import colorConverter
from matplotlib.collections import RegularPolyCollection
from matplotlib.pyplot import figure, show
from numpy import nonzero
from numpy.random import rand
class Datum:
    colorin = colorConverter.to_rgba('red')
    colorout = colorConverter.to_rgba('green')
    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:
    def __init__(self, ax, data):
        self.axes = ax
        self.canvas = ax.figure.canvas
        self.data = data
        #the lasso lock boolean is used to tell whether another
        #widget event has priority
        self.lassoLock = False
        self.Nxy = len(data)
        facecolors = [d.color for d in data]
        self.xys = [(d.x, d.y) for d in data]
        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)
        self.cidRelease = self.canvas.mpl_connect('button_release_event', self.onrelease)
        self.ind = None
    def callback(self, verts):
        facecolors = self.collection.get_facecolors()
        ind = nonzero(points_inside_poly(self.xys, verts))[0]
        for i in range(self.Nxy):
            if i in ind:
                facecolors[i] = Datum.colorin
            else:
                facecolors[i] = Datum.colorout
        self.canvas.draw_idle()
        self.canvas.widgetlock.release(self.lasso)
        #del self.lasso
        self.ind = ind
    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)
        # establish boolean that can be used to release the widgetlock
        self.lassoLock = True
    def onrelease(self, event):
        'on release we reset the press data'
        # test whether the widgetlock was initiated by the lasso
        if self.lassoLock:
            self.canvas.widgetlock.release(self.lasso)
            self.lassoLock = False
        print self.ind
data = [Datum(*xy) for xy in rand(10,2)]
fig = figure()
ax = fig.add_subplot(111, xlim=(0,1), ylim=(0,1), autoscale_on=False)
lman = LassoManager(ax, data)
show()
проблема в том, что в примере массив генерируется случайным образом(5 строка снизу), как переписать под массив данных, который не генерируется случайным образом??
Konstantin91
дклается просто.

rand(10,2) генерит матрицу состоящую из 2 столбцов и 10 строк. в ней числа от 0 до 1,
соответственно можно подставить
array=[ [0.3, 0,4] , [0.5, 0.7] ]
- таким образом получим две точки с коородинатами x1=0.3, y1 =0.4 , и x2=0.5 , y2=0.7

обязательно состовлять массив из чисел в диапазоне от 0 до 1, так как ColotConvert работает именно с такими числами.

А можно ли использовать другую функцию меняющую цвет, работающую со всеми числами?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB