mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-24 14:15:14 +02:00
Relocated
This commit is contained in:
parent
1c922a830f
commit
960ebeb32f
1 changed files with 139 additions and 0 deletions
|
|
@ -0,0 +1,139 @@
|
||||||
|
'''
|
||||||
|
Created on 24 Jul 2013
|
||||||
|
|
||||||
|
@author: maxz
|
||||||
|
'''
|
||||||
|
import numpy
|
||||||
|
|
||||||
|
class AxisEventController(object):
|
||||||
|
def __init__(self, ax):
|
||||||
|
self.ax = ax
|
||||||
|
self.activate()
|
||||||
|
def deactivate(self):
|
||||||
|
for cb_class in self.ax.callbacks.callbacks.values():
|
||||||
|
for cb_num in cb_class.keys():
|
||||||
|
self.ax.callbacks.disconnect(cb_num)
|
||||||
|
def activate(self):
|
||||||
|
self.ax.callbacks.connect('xlim_changed', self.xlim_changed)
|
||||||
|
self.ax.callbacks.connect('ylim_changed', self.ylim_changed)
|
||||||
|
def xlim_changed(self, ax):
|
||||||
|
pass
|
||||||
|
def ylim_changed(self, ax):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class AxisChangedController(AxisEventController):
|
||||||
|
'''
|
||||||
|
Buffered control of axis limit changes
|
||||||
|
'''
|
||||||
|
_changing = False
|
||||||
|
|
||||||
|
def __init__(self, ax, update_lim=None):
|
||||||
|
'''
|
||||||
|
Constructor
|
||||||
|
'''
|
||||||
|
super(AxisChangedController, self).__init__(ax)
|
||||||
|
self._lim_ratio_threshold = update_lim or .8
|
||||||
|
self._x_lim = self.ax.get_xlim()
|
||||||
|
self._y_lim = self.ax.get_ylim()
|
||||||
|
|
||||||
|
def update(self, ax):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def xlim_changed(self, ax):
|
||||||
|
super(AxisChangedController, self).xlim_changed(ax)
|
||||||
|
if not self._changing and self.lim_changed(ax.get_xlim(), self._x_lim):
|
||||||
|
self._changing = True
|
||||||
|
self._x_lim = ax.get_xlim()
|
||||||
|
self.update(ax)
|
||||||
|
self._changing = False
|
||||||
|
|
||||||
|
def ylim_changed(self, ax):
|
||||||
|
super(AxisChangedController, self).ylim_changed(ax)
|
||||||
|
if not self._changing and self.lim_changed(ax.get_ylim(), self._y_lim):
|
||||||
|
self._changing = True
|
||||||
|
self._y_lim = ax.get_ylim()
|
||||||
|
self.update(ax)
|
||||||
|
self._changing = False
|
||||||
|
|
||||||
|
def extent(self, lim):
|
||||||
|
return numpy.subtract(*lim)
|
||||||
|
|
||||||
|
def lim_changed(self, axlim, savedlim):
|
||||||
|
axextent = self.extent(axlim)
|
||||||
|
extent = self.extent(savedlim)
|
||||||
|
lim_changed = ((axextent / extent) < self._lim_ratio_threshold ** 2
|
||||||
|
or (extent / axextent) < self._lim_ratio_threshold ** 2
|
||||||
|
or ((1 - (self.extent((axlim[0], savedlim[0])) / self.extent((savedlim[0], axlim[1]))))
|
||||||
|
< self._lim_ratio_threshold)
|
||||||
|
or ((1 - (self.extent((savedlim[0], axlim[0])) / self.extent((axlim[0], savedlim[1]))))
|
||||||
|
< self._lim_ratio_threshold)
|
||||||
|
)
|
||||||
|
return lim_changed
|
||||||
|
|
||||||
|
def _buffer_lim(self, lim):
|
||||||
|
# buffer_size = 1 - self._lim_ratio_threshold
|
||||||
|
# extent = self.extent(lim)
|
||||||
|
return lim
|
||||||
|
|
||||||
|
|
||||||
|
class BufferedAxisChangedController(AxisChangedController):
|
||||||
|
def __init__(self, ax, plot_function, plot_limits, resolution=50, update_lim=None, **kwargs):
|
||||||
|
"""
|
||||||
|
:param plot_function:
|
||||||
|
function to use for creating image for plotting (return ndarray-like)
|
||||||
|
plot_function gets called with (2D!) Xtest grid if replotting required
|
||||||
|
:type plot_function: function
|
||||||
|
:param plot_limits:
|
||||||
|
beginning plot limits [xmin, ymin, xmax, ymax]
|
||||||
|
|
||||||
|
:param kwargs: additional kwargs are for pyplot.imshow(**kwargs)
|
||||||
|
"""
|
||||||
|
super(BufferedAxisChangedController, self).__init__(ax, update_lim=update_lim)
|
||||||
|
self.plot_function = plot_function
|
||||||
|
xmin, xmax = self._x_lim # self._compute_buffered(*self._x_lim)
|
||||||
|
ymin, ymax = self._y_lim # self._compute_buffered(*self._y_lim)
|
||||||
|
self.resolution = resolution
|
||||||
|
self._not_init = False
|
||||||
|
self.view = self._init_view(self.ax, self.recompute_X(), xmin, xmax, ymin, ymax, **kwargs)
|
||||||
|
self._not_init = True
|
||||||
|
|
||||||
|
def update(self, ax):
|
||||||
|
super(BufferedAxisChangedController, self).update(ax)
|
||||||
|
if self._not_init:
|
||||||
|
xmin, xmax = self._compute_buffered(*self._x_lim)
|
||||||
|
ymin, ymax = self._compute_buffered(*self._y_lim)
|
||||||
|
self.update_view(self.view, self.recompute_X(), xmin, xmax, ymin, ymax)
|
||||||
|
|
||||||
|
def _init_view(self, ax, X, xmin, xmax, ymin, ymax):
|
||||||
|
raise NotImplementedError('return view for this controller')
|
||||||
|
|
||||||
|
def update_view(self, view, X, xmin, xmax, ymin, ymax):
|
||||||
|
raise NotImplementedError('update view given in here')
|
||||||
|
|
||||||
|
def get_grid(self):
|
||||||
|
xmin, xmax = self._compute_buffered(*self._x_lim)
|
||||||
|
ymin, ymax = self._compute_buffered(*self._y_lim)
|
||||||
|
x, y = numpy.mgrid[xmin:xmax:1j * self.resolution, ymin:ymax:1j * self.resolution]
|
||||||
|
return numpy.hstack((x.flatten()[:, None], y.flatten()[:, None]))
|
||||||
|
|
||||||
|
def recompute_X(self):
|
||||||
|
X = self.plot_function(self.get_grid())
|
||||||
|
if isinstance(X, (tuple, list)):
|
||||||
|
for x in X:
|
||||||
|
x.shape = [self.resolution, self.resolution]
|
||||||
|
x[:, :] = x.T[::-1, :]
|
||||||
|
return X
|
||||||
|
return X.reshape(self.resolution, self.resolution).T[::-1, :]
|
||||||
|
|
||||||
|
def _compute_buffered(self, mi, ma):
|
||||||
|
buffersize = self._buffersize()
|
||||||
|
size = ma - mi
|
||||||
|
return mi - (buffersize * size), ma + (buffersize * size)
|
||||||
|
|
||||||
|
def _buffersize(self):
|
||||||
|
try:
|
||||||
|
buffersize = 1. - self._lim_ratio_threshold
|
||||||
|
except:
|
||||||
|
buffersize = .4
|
||||||
|
return buffersize
|
||||||
Loading…
Add table
Add a link
Reference in a new issue