diff --git a/GPy/plotting/matplotlib/plot.py b/GPy/plotting/matplotlib/plot.py
deleted file mode 100644
index f44864f3..00000000
--- a/GPy/plotting/matplotlib/plot.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# #Copyright (c) 2012, GPy authors (see AUTHORS.txt).
-# Licensed under the BSD 3-clause license (see LICENSE.txt)
-
-
-import Tango
-import pylab as pb
-import numpy as np
-
-def gpplot(x,mu,lower,upper,edgecol=Tango.colorsHex['darkBlue'],fillcol=Tango.colorsHex['lightBlue'],axes=None,**kwargs):
- if axes is None:
- axes = pb.gca()
- mu = mu.flatten()
- x = x.flatten()
- lower = lower.flatten()
- upper = upper.flatten()
-
- #here's the mean
- axes.plot(x,mu,color=edgecol,linewidth=2)
-
- #here's the box
- kwargs['linewidth']=0.5
- if not 'alpha' in kwargs.keys():
- kwargs['alpha'] = 0.3
- axes.fill(np.hstack((x,x[::-1])),np.hstack((upper,lower[::-1])),color=fillcol,**kwargs)
-
- #this is the edge:
- axes.plot(x,upper,color=edgecol,linewidth=0.2)
- axes.plot(x,lower,color=edgecol,linewidth=0.2)
-
-def removeRightTicks(ax=None):
- ax = ax or pb.gca()
- for i, line in enumerate(ax.get_yticklines()):
- if i%2 == 1: # odd indices
- line.set_visible(False)
-def removeUpperTicks(ax=None):
- ax = ax or pb.gca()
- for i, line in enumerate(ax.get_xticklines()):
- if i%2 == 1: # odd indices
- line.set_visible(False)
-def fewerXticks(ax=None,divideby=2):
- ax = ax or pb.gca()
- ax.set_xticks(ax.get_xticks()[::divideby])
-
-def align_subplots(N,M,xlim=None, ylim=None):
- """make all of the subplots have the same limits, turn off unnecessary ticks"""
- #find sensible xlim,ylim
- if xlim is None:
- xlim = [np.inf,-np.inf]
- for i in range(N*M):
- pb.subplot(N,M,i+1)
- xlim[0] = min(xlim[0],pb.xlim()[0])
- xlim[1] = max(xlim[1],pb.xlim()[1])
- if ylim is None:
- ylim = [np.inf,-np.inf]
- for i in range(N*M):
- pb.subplot(N,M,i+1)
- ylim[0] = min(ylim[0],pb.ylim()[0])
- ylim[1] = max(ylim[1],pb.ylim()[1])
-
- for i in range(N*M):
- pb.subplot(N,M,i+1)
- pb.xlim(xlim)
- pb.ylim(ylim)
- if (i)%M:
- pb.yticks([])
- else:
- removeRightTicks()
- if i<(M*(N-1)):
- pb.xticks([])
- else:
- removeUpperTicks()
-
-def align_subplot_array(axes,xlim=None, ylim=None):
- """make all of the axes in the array hae the same limits, turn off unnecessary ticks
-
- use pb.subplots() to get an array of axes
- """
- #find sensible xlim,ylim
- if xlim is None:
- xlim = [np.inf,-np.inf]
- for ax in axes.flatten():
- xlim[0] = min(xlim[0],ax.get_xlim()[0])
- xlim[1] = max(xlim[1],ax.get_xlim()[1])
- if ylim is None:
- ylim = [np.inf,-np.inf]
- for ax in axes.flatten():
- ylim[0] = min(ylim[0],ax.get_ylim()[0])
- ylim[1] = max(ylim[1],ax.get_ylim()[1])
-
- N,M = axes.shape
- for i,ax in enumerate(axes.flatten()):
- ax.set_xlim(xlim)
- ax.set_ylim(ylim)
- if (i)%M:
- ax.set_yticks([])
- else:
- removeRightTicks(ax)
- if i<(M*(N-1)):
- ax.set_xticks([])
- else:
- removeUpperTicks(ax)
-
-def x_frame1D(X,plot_limits=None,resolution=None):
- """
- Internal helper function for making plots, returns a set of input values to plot as well as lower and upper limits
- """
- assert X.shape[1] ==1, "x_frame1D is defined for one-dimensional inputs"
- if plot_limits is None:
- xmin,xmax = X.min(0),X.max(0)
- xmin, xmax = xmin-0.2*(xmax-xmin), xmax+0.2*(xmax-xmin)
- elif len(plot_limits)==2:
- xmin, xmax = plot_limits
- else:
- raise ValueError, "Bad limits for plotting"
-
- Xnew = np.linspace(xmin,xmax,resolution or 200)[:,None]
- return Xnew, xmin, xmax
-
-def x_frame2D(X,plot_limits=None,resolution=None):
- """
- Internal helper function for making plots, returns a set of input values to plot as well as lower and upper limits
- """
- assert X.shape[1] ==2, "x_frame2D is defined for two-dimensional inputs"
- if plot_limits is None:
- xmin,xmax = X.min(0),X.max(0)
- xmin, xmax = xmin-0.2*(xmax-xmin), xmax+0.2*(xmax-xmin)
- elif len(plot_limits)==2:
- xmin, xmax = plot_limits
- else:
- raise ValueError, "Bad limits for plotting"
-
- resolution = resolution or 50
- xx,yy = np.mgrid[xmin[0]:xmax[0]:1j*resolution,xmin[1]:xmax[1]:1j*resolution]
- Xnew = np.vstack((xx.flatten(),yy.flatten())).T
- return Xnew, xx, yy, xmin, xmax
diff --git a/GPy/util/Tango.py b/GPy/util/Tango.py
deleted file mode 100644
index eeb2e075..00000000
--- a/GPy/util/Tango.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# Copyright (c) 2012, GPy authors (see AUTHORS.txt).
-# Licensed under the BSD 3-clause license (see LICENSE.txt)
-
-
-import matplotlib as mpl
-import pylab as pb
-import sys
-#sys.path.append('/home/james/mlprojects/sitran_cluster/')
-#from switch_pylab_backend import *
-
-
-#this stuff isn;t really Tango related: maybe it could be moved out? TODO
-def removeRightTicks(ax=None):
- ax = ax or pb.gca()
- for i, line in enumerate(ax.get_yticklines()):
- if i%2 == 1: # odd indices
- line.set_visible(False)
-def removeUpperTicks(ax=None):
- ax = ax or pb.gca()
- for i, line in enumerate(ax.get_xticklines()):
- if i%2 == 1: # odd indices
- line.set_visible(False)
-def fewerXticks(ax=None,divideby=2):
- ax = ax or pb.gca()
- ax.set_xticks(ax.get_xticks()[::divideby])
-
-
-colorsHex = {\
-"Aluminium6":"#2e3436",\
-"Aluminium5":"#555753",\
-"Aluminium4":"#888a85",\
-"Aluminium3":"#babdb6",\
-"Aluminium2":"#d3d7cf",\
-"Aluminium1":"#eeeeec",\
-"lightPurple":"#ad7fa8",\
-"mediumPurple":"#75507b",\
-"darkPurple":"#5c3566",\
-"lightBlue":"#729fcf",\
-"mediumBlue":"#3465a4",\
-"darkBlue": "#204a87",\
-"lightGreen":"#8ae234",\
-"mediumGreen":"#73d216",\
-"darkGreen":"#4e9a06",\
-"lightChocolate":"#e9b96e",\
-"mediumChocolate":"#c17d11",\
-"darkChocolate":"#8f5902",\
-"lightRed":"#ef2929",\
-"mediumRed":"#cc0000",\
-"darkRed":"#a40000",\
-"lightOrange":"#fcaf3e",\
-"mediumOrange":"#f57900",\
-"darkOrange":"#ce5c00",\
-"lightButter":"#fce94f",\
-"mediumButter":"#edd400",\
-"darkButter":"#c4a000"}
-
-darkList = [colorsHex['darkBlue'],colorsHex['darkRed'],colorsHex['darkGreen'], colorsHex['darkOrange'], colorsHex['darkButter'], colorsHex['darkPurple'], colorsHex['darkChocolate'], colorsHex['Aluminium6']]
-mediumList = [colorsHex['mediumBlue'], colorsHex['mediumRed'],colorsHex['mediumGreen'], colorsHex['mediumOrange'], colorsHex['mediumButter'], colorsHex['mediumPurple'], colorsHex['mediumChocolate'], colorsHex['Aluminium5']]
-lightList = [colorsHex['lightBlue'], colorsHex['lightRed'],colorsHex['lightGreen'], colorsHex['lightOrange'], colorsHex['lightButter'], colorsHex['lightPurple'], colorsHex['lightChocolate'], colorsHex['Aluminium4']]
-
-def currentDark():
- return darkList[-1]
-def currentMedium():
- return mediumList[-1]
-def currentLight():
- return lightList[-1]
-
-def nextDark():
- darkList.append(darkList.pop(0))
- return darkList[-1]
-def nextMedium():
- mediumList.append(mediumList.pop(0))
- return mediumList[-1]
-def nextLight():
- lightList.append(lightList.pop(0))
- return lightList[-1]
-
-def reset():
- while not darkList[0]==colorsHex['darkBlue']:
- darkList.append(darkList.pop(0))
- while not mediumList[0]==colorsHex['mediumBlue']:
- mediumList.append(mediumList.pop(0))
- while not lightList[0]==colorsHex['lightBlue']:
- lightList.append(lightList.pop(0))
-
-def setLightFigures():
- mpl.rcParams['axes.edgecolor']=colorsHex['Aluminium6']
- mpl.rcParams['axes.facecolor']=colorsHex['Aluminium2']
- mpl.rcParams['axes.labelcolor']=colorsHex['Aluminium6']
- mpl.rcParams['figure.edgecolor']=colorsHex['Aluminium6']
- mpl.rcParams['figure.facecolor']=colorsHex['Aluminium2']
- mpl.rcParams['grid.color']=colorsHex['Aluminium6']
- mpl.rcParams['savefig.edgecolor']=colorsHex['Aluminium2']
- mpl.rcParams['savefig.facecolor']=colorsHex['Aluminium2']
- mpl.rcParams['text.color']=colorsHex['Aluminium6']
- mpl.rcParams['xtick.color']=colorsHex['Aluminium6']
- mpl.rcParams['ytick.color']=colorsHex['Aluminium6']
-
-def setDarkFigures():
- mpl.rcParams['axes.edgecolor']=colorsHex['Aluminium2']
- mpl.rcParams['axes.facecolor']=colorsHex['Aluminium6']
- mpl.rcParams['axes.labelcolor']=colorsHex['Aluminium2']
- mpl.rcParams['figure.edgecolor']=colorsHex['Aluminium2']
- mpl.rcParams['figure.facecolor']=colorsHex['Aluminium6']
- mpl.rcParams['grid.color']=colorsHex['Aluminium2']
- mpl.rcParams['savefig.edgecolor']=colorsHex['Aluminium6']
- mpl.rcParams['savefig.facecolor']=colorsHex['Aluminium6']
- mpl.rcParams['text.color']=colorsHex['Aluminium2']
- mpl.rcParams['xtick.color']=colorsHex['Aluminium2']
- mpl.rcParams['ytick.color']=colorsHex['Aluminium2']
-
-def hex2rgb(hexcolor):
- hexcolor = [hexcolor[1+2*i:1+2*(i+1)] for i in range(3)]
- r,g,b = [int(n,16) for n in hexcolor]
- return (r,g,b)
-
-colorsRGB = dict([(k,hex2rgb(i)) for k,i in colorsHex.items()])
-
-cdict_RB = {'red' :((0.,colorsRGB['mediumRed'][0]/256.,colorsRGB['mediumRed'][0]/256.),
- (.5,colorsRGB['mediumPurple'][0]/256.,colorsRGB['mediumPurple'][0]/256.),
- (1.,colorsRGB['mediumBlue'][0]/256.,colorsRGB['mediumBlue'][0]/256.)),
- 'green':((0.,colorsRGB['mediumRed'][1]/256.,colorsRGB['mediumRed'][1]/256.),
- (.5,colorsRGB['mediumPurple'][1]/256.,colorsRGB['mediumPurple'][1]/256.),
- (1.,colorsRGB['mediumBlue'][1]/256.,colorsRGB['mediumBlue'][1]/256.)),
- 'blue':((0.,colorsRGB['mediumRed'][2]/256.,colorsRGB['mediumRed'][2]/256.),
- (.5,colorsRGB['mediumPurple'][2]/256.,colorsRGB['mediumPurple'][2]/256.),
- (1.,colorsRGB['mediumBlue'][2]/256.,colorsRGB['mediumBlue'][2]/256.))}
-
-cdict_BGR = {'red' :((0.,colorsRGB['mediumBlue'][0]/256.,colorsRGB['mediumBlue'][0]/256.),
- (.5,colorsRGB['mediumGreen'][0]/256.,colorsRGB['mediumGreen'][0]/256.),
- (1.,colorsRGB['mediumRed'][0]/256.,colorsRGB['mediumRed'][0]/256.)),
- 'green':((0.,colorsRGB['mediumBlue'][1]/256.,colorsRGB['mediumBlue'][1]/256.),
- (.5,colorsRGB['mediumGreen'][1]/256.,colorsRGB['mediumGreen'][1]/256.),
- (1.,colorsRGB['mediumRed'][1]/256.,colorsRGB['mediumRed'][1]/256.)),
- 'blue':((0.,colorsRGB['mediumBlue'][2]/256.,colorsRGB['mediumBlue'][2]/256.),
- (.5,colorsRGB['mediumGreen'][2]/256.,colorsRGB['mediumGreen'][2]/256.),
- (1.,colorsRGB['mediumRed'][2]/256.,colorsRGB['mediumRed'][2]/256.))}
-
-
-cdict_Alu = {'red' :((0./5,colorsRGB['Aluminium1'][0]/256.,colorsRGB['Aluminium1'][0]/256.),
- (1./5,colorsRGB['Aluminium2'][0]/256.,colorsRGB['Aluminium2'][0]/256.),
- (2./5,colorsRGB['Aluminium3'][0]/256.,colorsRGB['Aluminium3'][0]/256.),
- (3./5,colorsRGB['Aluminium4'][0]/256.,colorsRGB['Aluminium4'][0]/256.),
- (4./5,colorsRGB['Aluminium5'][0]/256.,colorsRGB['Aluminium5'][0]/256.),
- (5./5,colorsRGB['Aluminium6'][0]/256.,colorsRGB['Aluminium6'][0]/256.)),
- 'green' :((0./5,colorsRGB['Aluminium1'][1]/256.,colorsRGB['Aluminium1'][1]/256.),
- (1./5,colorsRGB['Aluminium2'][1]/256.,colorsRGB['Aluminium2'][1]/256.),
- (2./5,colorsRGB['Aluminium3'][1]/256.,colorsRGB['Aluminium3'][1]/256.),
- (3./5,colorsRGB['Aluminium4'][1]/256.,colorsRGB['Aluminium4'][1]/256.),
- (4./5,colorsRGB['Aluminium5'][1]/256.,colorsRGB['Aluminium5'][1]/256.),
- (5./5,colorsRGB['Aluminium6'][1]/256.,colorsRGB['Aluminium6'][1]/256.)),
- 'blue' :((0./5,colorsRGB['Aluminium1'][2]/256.,colorsRGB['Aluminium1'][2]/256.),
- (1./5,colorsRGB['Aluminium2'][2]/256.,colorsRGB['Aluminium2'][2]/256.),
- (2./5,colorsRGB['Aluminium3'][2]/256.,colorsRGB['Aluminium3'][2]/256.),
- (3./5,colorsRGB['Aluminium4'][2]/256.,colorsRGB['Aluminium4'][2]/256.),
- (4./5,colorsRGB['Aluminium5'][2]/256.,colorsRGB['Aluminium5'][2]/256.),
- (5./5,colorsRGB['Aluminium6'][2]/256.,colorsRGB['Aluminium6'][2]/256.))}
-# cmap_Alu = mpl.colors.LinearSegmentedColormap('TangoAluminium',cdict_Alu,256)
-# cmap_BGR = mpl.colors.LinearSegmentedColormap('TangoRedBlue',cdict_BGR,256)
-# cmap_RB = mpl.colors.LinearSegmentedColormap('TangoRedBlue',cdict_RB,256)
-if __name__=='__main__':
- import pylab as pb
- pb.figure()
- pb.pcolor(pb.rand(10,10),cmap=cmap_RB)
- pb.colorbar()
- pb.show()
diff --git a/GPy/util/latent_space_visualizations/__init__.py b/GPy/util/latent_space_visualizations/__init__.py
deleted file mode 100644
index ee595945..00000000
--- a/GPy/util/latent_space_visualizations/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-import controllers
diff --git a/GPy/util/latent_space_visualizations/controllers/__init__.py b/GPy/util/latent_space_visualizations/controllers/__init__.py
deleted file mode 100644
index 25f6535e..00000000
--- a/GPy/util/latent_space_visualizations/controllers/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-import axis_event_controller, imshow_controller
diff --git a/GPy/util/latent_space_visualizations/controllers/axis_event_controller.py b/GPy/util/latent_space_visualizations/controllers/axis_event_controller.py
deleted file mode 100644
index acb1ac8d..00000000
--- a/GPy/util/latent_space_visualizations/controllers/axis_event_controller.py
+++ /dev/null
@@ -1,142 +0,0 @@
-'''
-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
-
-
-
diff --git a/GPy/util/latent_space_visualizations/controllers/imshow_controller.py b/GPy/util/latent_space_visualizations/controllers/imshow_controller.py
deleted file mode 100644
index fa6682e9..00000000
--- a/GPy/util/latent_space_visualizations/controllers/imshow_controller.py
+++ /dev/null
@@ -1,71 +0,0 @@
-'''
-Created on 24 Jul 2013
-
-@author: maxz
-'''
-from GPy.util.latent_space_visualizations.controllers.axis_event_controller import BufferedAxisChangedController
-import itertools
-import numpy
-
-
-class ImshowController(BufferedAxisChangedController):
- def __init__(self, ax, plot_function, plot_limits, resolution=50, update_lim=.5, **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(ImshowController, self).__init__(ax, plot_function, plot_limits, resolution, update_lim, **kwargs)
-
- def _init_view(self, ax, X, xmin, xmax, ymin, ymax, **kwargs):
- return ax.imshow(X, extent=(xmin, xmax,
- ymin, ymax),
- vmin=X.min(),
- vmax=X.max(),
- **kwargs)
-
- def update_view(self, view, X, xmin, xmax, ymin, ymax):
- view.set_data(X)
- view.set_extent((xmin, xmax, ymin, ymax))
-
-class ImAnnotateController(ImshowController):
- def __init__(self, ax, plot_function, plot_limits, resolution=20, update_lim=.99, **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 text_props: kwargs for pyplot.text(**text_props)
- :param kwargs: additional kwargs are for pyplot.imshow(**kwargs)
- """
- super(ImAnnotateController, self).__init__(ax, plot_function, plot_limits, resolution, update_lim, **kwargs)
-
- def _init_view(self, ax, X, xmin, xmax, ymin, ymax, text_props={}, **kwargs):
- view = [super(ImAnnotateController, self)._init_view(ax, X[0], xmin, xmax, ymin, ymax, **kwargs)]
- xoffset, yoffset = self._offsets(xmin, xmax, ymin, ymax)
- xlin = numpy.linspace(xmin, xmax, self.resolution, endpoint=False)
- ylin = numpy.linspace(ymin, ymax, self.resolution, endpoint=False)
- for [i, x], [j, y] in itertools.product(enumerate(xlin), enumerate(ylin[::-1])):
- view.append(ax.text(x + xoffset, y + yoffset, "{}".format(X[1][j, i]), ha='center', va='center', **text_props))
- return view
-
- def update_view(self, view, X, xmin, xmax, ymin, ymax):
- super(ImAnnotateController, self).update_view(view[0], X[0], xmin, xmax, ymin, ymax)
- xoffset, yoffset = self._offsets(xmin, xmax, ymin, ymax)
- xlin = numpy.linspace(xmin, xmax, self.resolution, endpoint=False)
- ylin = numpy.linspace(ymin, ymax, self.resolution, endpoint=False)
- for [[i, x], [j, y]], text in itertools.izip(itertools.product(enumerate(xlin), enumerate(ylin[::-1])), view[1:]):
- text.set_x(x + xoffset)
- text.set_y(y + yoffset)
- text.set_text("{}".format(X[1][j, i]))
- return view
-
- def _offsets(self, xmin, xmax, ymin, ymax):
- return (xmax - xmin) / (2 * self.resolution), (ymax - ymin) / (2 * self.resolution)
diff --git a/GPy/util/maps.py b/GPy/util/maps.py
deleted file mode 100644
index e18c7e68..00000000
--- a/GPy/util/maps.py
+++ /dev/null
@@ -1,161 +0,0 @@
-import numpy as np
-import pylab as pb
-import matplotlib.patches as patches
-from matplotlib.patches import Polygon
-from matplotlib.collections import PatchCollection
-#from matplotlib import cm
-import shapefile
-import re
-
-pb.ion()
-
-def plot(shape_records,facecolor='w',edgecolor='k',linewidths=.5, ax=None,xlims=None,ylims=None):
- """
- Plot the geometry of a shapefile
-
- :param shape_records: geometry and attributes list
- :type shape_records: ShapeRecord object (output of a shapeRecords() method)
- :param facecolor: color to be used to fill in polygons
- :param edgecolor: color to be used for lines
- :param ax: axes to plot on.
- :type ax: axes handle
- """
- #Axes handle
- if ax is None:
- fig = pb.figure()
- ax = fig.add_subplot(111)
-
- #Iterate over shape_records
- for srec in shape_records:
- points = np.vstack(srec.shape.points)
- sparts = srec.shape.parts
- par = list(sparts) + [points.shape[0]]
-
- polygs = []
- for pj in xrange(len(sparts)):
- polygs.append(Polygon(points[par[pj]:par[pj+1]]))
- ax.add_collection(PatchCollection(polygs,facecolor=facecolor,edgecolor=edgecolor, linewidths=linewidths))
-
- #Plot limits
- _box = np.vstack([srec.shape.bbox for srec in shape_records])
- minx,miny = np.min(_box[:,:2],0)
- maxx,maxy = np.max(_box[:,2:],0)
-
- if xlims is not None:
- minx,maxx = xlims
- if ylims is not None:
- miny,maxy = ylims
- ax.set_xlim(minx,maxx)
- ax.set_ylim(miny,maxy)
-
-
-def string_match(sf,regex,field=2):
- """
- Return the geometry and attributes of a shapefile whose fields match a regular expression given
-
- :param sf: shapefile
- :type sf: shapefile object
- :regex: regular expression to match
- :type regex: string
- :field: field number to be matched with the regex
- :type field: integer
- """
- index = []
- shape_records = []
- for rec in enumerate(sf.shapeRecords()):
- m = re.search(regex,rec[1].record[field])
- if m is not None:
- index.append(rec[0])
- shape_records.append(rec[1])
- return index,shape_records
-
-def bbox_match(sf,bbox,inside_only=True):
- """
- Return the geometry and attributes of a shapefile that lie within (or intersect) a bounding box
-
- :param sf: shapefile
- :type sf: shapefile object
- :param bbox: bounding box
- :type bbox: list of floats [x_min,y_min,x_max,y_max]
- :inside_only: True if the objects returned are those that lie within the bbox and False if the objects returned are any that intersect the bbox
- :type inside_only: Boolean
- """
- A,B,C,D = bbox
- index = []
- shape_records = []
- for rec in enumerate(sf.shapeRecords()):
- a,b,c,d = rec[1].shape.bbox
- if inside_only:
- if A <= a and B <= b and C >= c and D >= d:
- index.append(rec[0])
- shape_records.append(rec[1])
- else:
- cond1 = A <= a and B <= b and C >= a and D >= b
- cond2 = A <= c and B <= d and C >= c and D >= d
- cond3 = A <= a and D >= d and C >= a and B <= d
- cond4 = A <= c and D >= b and C >= c and B <= b
- cond5 = a <= C and b <= B and d >= D
- cond6 = c <= A and b <= B and d >= D
- cond7 = d <= B and a <= A and c >= C
- cond8 = b <= D and a <= A and c >= C
- if cond1 or cond2 or cond3 or cond4 or cond5 or cond6 or cond7 or cond8:
- index.append(rec[0])
- shape_records.append(rec[1])
- return index,shape_records
-
-
-def plot_bbox(sf,bbox,inside_only=True):
- """
- Plot the geometry of a shapefile within a bbox
-
- :param sf: shapefile
- :type sf: shapefile object
- :param bbox: bounding box
- :type bbox: list of floats [x_min,y_min,x_max,y_max]
- :inside_only: True if the objects returned are those that lie within the bbox and False if the objects returned are any that intersect the bbox
- :type inside_only: Boolean
- """
- index,shape_records = bbox_match(sf,bbox,inside_only)
- A,B,C,D = bbox
- plot(shape_records,xlims=[bbox[0],bbox[2]],ylims=[bbox[1],bbox[3]])
-
-def plot_string_match(sf,regex,field):
- """
- Plot the geometry of a shapefile whose fields match a regular expression given
-
- :param sf: shapefile
- :type sf: shapefile object
- :regex: regular expression to match
- :type regex: string
- :field: field number to be matched with the regex
- :type field: integer
- """
- index,shape_records = string_match(sf,regex,field)
- plot(shape_records)
-
-
-def new_shape_string(sf,name,regex,field=2,type=shapefile.POINT):
-
- newshp = shapefile.Writer(shapeType = sf.shapeType)
- newshp.autoBalance = 1
-
- index,shape_records = string_match(sf,regex,field)
-
- _fi = [sf.fields[j] for j in index]
- for f in _fi:
- newshp.field(name=f[0],fieldType=f[1],size=f[2],decimal=f[3])
-
- _shre = shape_records
- for sr in _shre:
- _points = []
- _parts = []
- for point in sr.shape.points:
- _points.append(point)
- _parts.append(_points)
-
- newshp.line(parts=_parts)
- newshp.records.append(sr.record)
- print len(sr.record)
-
- newshp.save(name)
- print index
diff --git a/GPy/util/netpbmfile.py b/GPy/util/netpbmfile.py
deleted file mode 100644
index 030bd574..00000000
--- a/GPy/util/netpbmfile.py
+++ /dev/null
@@ -1,331 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# netpbmfile.py
-
-# Copyright (c) 2011-2013, Christoph Gohlke
-# Copyright (c) 2011-2013, The Regents of the University of California
-# Produced at the Laboratory for Fluorescence Dynamics.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * Neither the name of the copyright holders nor the names of any
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-"""Read and write image data from respectively to Netpbm files.
-
-This implementation follows the Netpbm format specifications at
-http://netpbm.sourceforge.net/doc/. No gamma correction is performed.
-
-The following image formats are supported: PBM (bi-level), PGM (grayscale),
-PPM (color), PAM (arbitrary), XV thumbnail (RGB332, read-only).
-
-:Author:
- `Christoph Gohlke `_
-
-:Organization:
- Laboratory for Fluorescence Dynamics, University of California, Irvine
-
-:Version: 2013.01.18
-
-Requirements
-------------
-* `CPython 2.7, 3.2 or 3.3 `_
-* `Numpy 1.7 `_
-* `Matplotlib 1.2 `_ (optional for plotting)
-
-Examples
---------
->>> im1 = numpy.array([[0, 1],[65534, 65535]], dtype=numpy.uint16)
->>> imsave('_tmp.pgm', im1)
->>> im2 = imread('_tmp.pgm')
->>> assert numpy.all(im1 == im2)
-
-"""
-
-from __future__ import division, print_function
-
-import sys
-import re
-import math
-from copy import deepcopy
-
-import numpy
-
-__version__ = '2013.01.18'
-__docformat__ = 'restructuredtext en'
-__all__ = ['imread', 'imsave', 'NetpbmFile']
-
-
-def imread(filename, *args, **kwargs):
- """Return image data from Netpbm file as numpy array.
-
- `args` and `kwargs` are arguments to NetpbmFile.asarray().
-
- Examples
- --------
- >>> image = imread('_tmp.pgm')
-
- """
- try:
- netpbm = NetpbmFile(filename)
- image = netpbm.asarray()
- finally:
- netpbm.close()
- return image
-
-
-def imsave(filename, data, maxval=None, pam=False):
- """Write image data to Netpbm file.
-
- Examples
- --------
- >>> image = numpy.array([[0, 1],[65534, 65535]], dtype=numpy.uint16)
- >>> imsave('_tmp.pgm', image)
-
- """
- try:
- netpbm = NetpbmFile(data, maxval=maxval)
- netpbm.write(filename, pam=pam)
- finally:
- netpbm.close()
-
-
-class NetpbmFile(object):
- """Read and write Netpbm PAM, PBM, PGM, PPM, files."""
-
- _types = {b'P1': b'BLACKANDWHITE', b'P2': b'GRAYSCALE', b'P3': b'RGB',
- b'P4': b'BLACKANDWHITE', b'P5': b'GRAYSCALE', b'P6': b'RGB',
- b'P7 332': b'RGB', b'P7': b'RGB_ALPHA'}
-
- def __init__(self, arg=None, **kwargs):
- """Initialize instance from filename, open file, or numpy array."""
- for attr in ('header', 'magicnum', 'width', 'height', 'maxval',
- 'depth', 'tupltypes', '_filename', '_fh', '_data'):
- setattr(self, attr, None)
- if arg is None:
- self._fromdata([], **kwargs)
- elif isinstance(arg, basestring):
- self._fh = open(arg, 'rb')
- self._filename = arg
- self._fromfile(self._fh, **kwargs)
- elif hasattr(arg, 'seek'):
- self._fromfile(arg, **kwargs)
- self._fh = arg
- else:
- self._fromdata(arg, **kwargs)
-
- def asarray(self, copy=True, cache=False, **kwargs):
- """Return image data from file as numpy array."""
- data = self._data
- if data is None:
- data = self._read_data(self._fh, **kwargs)
- if cache:
- self._data = data
- else:
- return data
- return deepcopy(data) if copy else data
-
- def write(self, arg, **kwargs):
- """Write instance to file."""
- if hasattr(arg, 'seek'):
- self._tofile(arg, **kwargs)
- else:
- with open(arg, 'wb') as fid:
- self._tofile(fid, **kwargs)
-
- def close(self):
- """Close open file. Future asarray calls might fail."""
- if self._filename and self._fh:
- self._fh.close()
- self._fh = None
-
- def __del__(self):
- self.close()
-
- def _fromfile(self, fh):
- """Initialize instance from open file."""
- fh.seek(0)
- data = fh.read(4096)
- if (len(data) < 7) or not (b'0' < data[1:2] < b'8'):
- raise ValueError("Not a Netpbm file:\n%s" % data[:32])
- try:
- self._read_pam_header(data)
- except Exception:
- try:
- self._read_pnm_header(data)
- except Exception:
- raise ValueError("Not a Netpbm file:\n%s" % data[:32])
-
- def _read_pam_header(self, data):
- """Read PAM header and initialize instance."""
- regroups = re.search(
- b"(^P7[\n\r]+(?:(?:[\n\r]+)|(?:#.*)|"
- b"(HEIGHT\s+\d+)|(WIDTH\s+\d+)|(DEPTH\s+\d+)|(MAXVAL\s+\d+)|"
- b"(?:TUPLTYPE\s+\w+))*ENDHDR\n)", data).groups()
- self.header = regroups[0]
- self.magicnum = b'P7'
- for group in regroups[1:]:
- key, value = group.split()
- setattr(self, unicode(key).lower(), int(value))
- matches = re.findall(b"(TUPLTYPE\s+\w+)", self.header)
- self.tupltypes = [s.split(None, 1)[1] for s in matches]
-
- def _read_pnm_header(self, data):
- """Read PNM header and initialize instance."""
- bpm = data[1:2] in b"14"
- regroups = re.search(b"".join((
- b"(^(P[123456]|P7 332)\s+(?:#.*[\r\n])*",
- b"\s*(\d+)\s+(?:#.*[\r\n])*",
- b"\s*(\d+)\s+(?:#.*[\r\n])*" * (not bpm),
- b"\s*(\d+)\s(?:\s*#.*[\r\n]\s)*)")), data).groups() + (1, ) * bpm
- self.header = regroups[0]
- self.magicnum = regroups[1]
- self.width = int(regroups[2])
- self.height = int(regroups[3])
- self.maxval = int(regroups[4])
- self.depth = 3 if self.magicnum in b"P3P6P7 332" else 1
- self.tupltypes = [self._types[self.magicnum]]
-
- def _read_data(self, fh, byteorder='>'):
- """Return image data from open file as numpy array."""
- fh.seek(len(self.header))
- data = fh.read()
- dtype = 'u1' if self.maxval < 256 else byteorder + 'u2'
- depth = 1 if self.magicnum == b"P7 332" else self.depth
- shape = [-1, self.height, self.width, depth]
- size = numpy.prod(shape[1:])
- if self.magicnum in b"P1P2P3":
- data = numpy.array(data.split(None, size)[:size], dtype)
- data = data.reshape(shape)
- elif self.maxval == 1:
- shape[2] = int(math.ceil(self.width / 8))
- data = numpy.frombuffer(data, dtype).reshape(shape)
- data = numpy.unpackbits(data, axis=-2)[:, :, :self.width, :]
- else:
- data = numpy.frombuffer(data, dtype)
- data = data[:size * (data.size // size)].reshape(shape)
- if data.shape[0] < 2:
- data = data.reshape(data.shape[1:])
- if data.shape[-1] < 2:
- data = data.reshape(data.shape[:-1])
- if self.magicnum == b"P7 332":
- rgb332 = numpy.array(list(numpy.ndindex(8, 8, 4)), numpy.uint8)
- rgb332 *= [36, 36, 85]
- data = numpy.take(rgb332, data, axis=0)
- return data
-
- def _fromdata(self, data, maxval=None):
- """Initialize instance from numpy array."""
- data = numpy.array(data, ndmin=2, copy=True)
- if data.dtype.kind not in "uib":
- raise ValueError("not an integer type: %s" % data.dtype)
- if data.dtype.kind == 'i' and numpy.min(data) < 0:
- raise ValueError("data out of range: %i" % numpy.min(data))
- if maxval is None:
- maxval = numpy.max(data)
- maxval = 255 if maxval < 256 else 65535
- if maxval < 0 or maxval > 65535:
- raise ValueError("data out of range: %i" % maxval)
- data = data.astype('u1' if maxval < 256 else '>u2')
- self._data = data
- if data.ndim > 2 and data.shape[-1] in (3, 4):
- self.depth = data.shape[-1]
- self.width = data.shape[-2]
- self.height = data.shape[-3]
- self.magicnum = b'P7' if self.depth == 4 else b'P6'
- else:
- self.depth = 1
- self.width = data.shape[-1]
- self.height = data.shape[-2]
- self.magicnum = b'P5' if maxval > 1 else b'P4'
- self.maxval = maxval
- self.tupltypes = [self._types[self.magicnum]]
- self.header = self._header()
-
- def _tofile(self, fh, pam=False):
- """Write Netbm file."""
- fh.seek(0)
- fh.write(self._header(pam))
- data = self.asarray(copy=False)
- if self.maxval == 1:
- data = numpy.packbits(data, axis=-1)
- data.tofile(fh)
-
- def _header(self, pam=False):
- """Return file header as byte string."""
- if pam or self.magicnum == b'P7':
- header = "\n".join((
- "P7",
- "HEIGHT %i" % self.height,
- "WIDTH %i" % self.width,
- "DEPTH %i" % self.depth,
- "MAXVAL %i" % self.maxval,
- "\n".join("TUPLTYPE %s" % unicode(i) for i in self.tupltypes),
- "ENDHDR\n"))
- elif self.maxval == 1:
- header = "P4 %i %i\n" % (self.width, self.height)
- elif self.depth == 1:
- header = "P5 %i %i %i\n" % (self.width, self.height, self.maxval)
- else:
- header = "P6 %i %i %i\n" % (self.width, self.height, self.maxval)
- if sys.version_info[0] > 2:
- header = bytes(header, 'ascii')
- return header
-
- def __str__(self):
- """Return information about instance."""
- return unicode(self.header)
-
-
-if sys.version_info[0] > 2:
- basestring = str
- unicode = lambda x: str(x, 'ascii')
-
-if __name__ == "__main__":
- # Show images specified on command line or all images in current directory
- from glob import glob
- from matplotlib import pyplot
- files = sys.argv[1:] if len(sys.argv) > 1 else glob('*.p*m')
- for fname in files:
- try:
- pam = NetpbmFile(fname)
- img = pam.asarray(copy=False)
- if False:
- pam.write('_tmp.pgm.out', pam=True)
- img2 = imread('_tmp.pgm.out')
- assert numpy.all(img == img2)
- imsave('_tmp.pgm.out', img)
- img2 = imread('_tmp.pgm.out')
- assert numpy.all(img == img2)
- pam.close()
- except ValueError as e:
- print(fname, e)
- continue
- _shape = img.shape
- if img.ndim > 3 or (img.ndim > 2 and img.shape[-1] not in (3, 4)):
- img = img[0]
- cmap = 'gray' if pam.maxval > 1 else 'binary'
- pyplot.imshow(img, cmap, interpolation='nearest')
- pyplot.title("%s %s %s %s" % (fname, unicode(pam.magicnum),
- _shape, img.dtype))
- pyplot.show()
diff --git a/GPy/util/plot_latent.py b/GPy/util/plot_latent.py
deleted file mode 100644
index fbf62c41..00000000
--- a/GPy/util/plot_latent.py
+++ /dev/null
@@ -1,181 +0,0 @@
-import pylab as pb
-import numpy as np
-from .. import util
-from GPy.util.latent_space_visualizations.controllers.imshow_controller import ImshowController
-from misc import param_to_array
-import itertools
-
-def most_significant_input_dimensions(model, which_indices):
- if which_indices is None:
- if model.input_dim == 1:
- input_1 = 0
- input_2 = None
- if model.input_dim == 2:
- input_1, input_2 = 0, 1
- else:
- try:
- input_1, input_2 = np.argsort(model.input_sensitivity())[::-1][:2]
- except:
- raise ValueError, "cannot automatically determine which dimensions to plot, please pass 'which_indices'"
- else:
- input_1, input_2 = which_indices
- return input_1, input_2
-
-def plot_latent(model, labels=None, which_indices=None,
- resolution=50, ax=None, marker='o', s=40,
- fignum=None, plot_inducing=False, legend=True,
- aspect='auto', updates=False):
- """
- :param labels: a np.array of size model.num_data containing labels for the points (can be number, strings, etc)
- :param resolution: the resolution of the grid on which to evaluate the predictive variance
- """
- if ax is None:
- fig = pb.figure(num=fignum)
- ax = fig.add_subplot(111)
- util.plot.Tango.reset()
-
- if labels is None:
- labels = np.ones(model.num_data)
-
- input_1, input_2 = most_significant_input_dimensions(model, which_indices)
- X = param_to_array(model.X)
-
- # first, plot the output variance as a function of the latent space
- Xtest, xx, yy, xmin, xmax = util.plot.x_frame2D(X[:, [input_1, input_2]], resolution=resolution)
- Xtest_full = np.zeros((Xtest.shape[0], model.X.shape[1]))
-
- def plot_function(x):
- Xtest_full[:, [input_1, input_2]] = x
- mu, var, low, up = model.predict(Xtest_full)
- var = var[:, :1]
- return np.log(var)
- view = ImshowController(ax, plot_function,
- tuple(X[:, [input_1, input_2]].min(0)) + tuple(X[:, [input_1, input_2]].max(0)),
- resolution, aspect=aspect, interpolation='bilinear',
- cmap=pb.cm.binary)
-
-# ax.imshow(var.reshape(resolution, resolution).T,
-# extent=[xmin[0], xmax[0], xmin[1], xmax[1]], cmap=pb.cm.binary, interpolation='bilinear', origin='lower')
-
- # make sure labels are in order of input:
- ulabels = []
- for lab in labels:
- if not lab in ulabels:
- ulabels.append(lab)
-
- marker = itertools.cycle(list(marker))
-
- for i, ul in enumerate(ulabels):
- if type(ul) is np.string_:
- this_label = ul
- elif type(ul) is np.int64:
- this_label = 'class %i' % ul
- else:
- this_label = 'class %i' % i
- m = marker.next()
-
- index = np.nonzero(labels == ul)[0]
- if model.input_dim == 1:
- x = X[index, input_1]
- y = np.zeros(index.size)
- else:
- x = X[index, input_1]
- y = X[index, input_2]
- ax.scatter(x, y, marker=m, s=s, color=util.plot.Tango.nextMedium(), label=this_label)
-
- ax.set_xlabel('latent dimension %i' % input_1)
- ax.set_ylabel('latent dimension %i' % input_2)
-
- if not np.all(labels == 1.) and legend:
- ax.legend(loc=0, numpoints=1)
-
- ax.set_xlim(xmin[0], xmax[0])
- ax.set_ylim(xmin[1], xmax[1])
- ax.grid(b=False) # remove the grid if present, it doesn't look good
- ax.set_aspect('auto') # set a nice aspect ratio
-
- if plot_inducing:
- Z = param_to_array(model.Z)
- ax.plot(Z[:, input_1], Z[:, input_2], '^w')
-
- if updates:
- ax.figure.canvas.show()
- raw_input('Enter to continue')
- return ax
-
-def plot_magnification(model, labels=None, which_indices=None,
- resolution=60, ax=None, marker='o', s=40,
- fignum=None, plot_inducing=False, legend=True,
- aspect='auto', updates=False):
- """
- :param labels: a np.array of size model.num_data containing labels for the points (can be number, strings, etc)
- :param resolution: the resolution of the grid on which to evaluate the predictive variance
- """
- if ax is None:
- fig = pb.figure(num=fignum)
- ax = fig.add_subplot(111)
- util.plot.Tango.reset()
-
- if labels is None:
- labels = np.ones(model.num_data)
-
- input_1, input_2 = most_significant_input_dimensions(model, which_indices)
-
- # first, plot the output variance as a function of the latent space
- Xtest, xx, yy, xmin, xmax = util.plot.x_frame2D(model.X[:, [input_1, input_2]], resolution=resolution)
- Xtest_full = np.zeros((Xtest.shape[0], model.X.shape[1]))
- def plot_function(x):
- Xtest_full[:, [input_1, input_2]] = x
- mf=model.magnification(Xtest_full)
- return mf
- view = ImshowController(ax, plot_function,
- tuple(model.X.min(0)[:, [input_1, input_2]]) + tuple(model.X.max(0)[:, [input_1, input_2]]),
- resolution, aspect=aspect, interpolation='bilinear',
- cmap=pb.cm.gray)
-
- # make sure labels are in order of input:
- ulabels = []
- for lab in labels:
- if not lab in ulabels:
- ulabels.append(lab)
-
- marker = itertools.cycle(list(marker))
-
- for i, ul in enumerate(ulabels):
- if type(ul) is np.string_:
- this_label = ul
- elif type(ul) is np.int64:
- this_label = 'class %i' % ul
- else:
- this_label = 'class %i' % i
- m = marker.next()
-
- index = np.nonzero(labels == ul)[0]
- if model.input_dim == 1:
- x = model.X[index, input_1]
- y = np.zeros(index.size)
- else:
- x = model.X[index, input_1]
- y = model.X[index, input_2]
- ax.scatter(x, y, marker=m, s=s, color=util.plot.Tango.nextMedium(), label=this_label)
-
- ax.set_xlabel('latent dimension %i' % input_1)
- ax.set_ylabel('latent dimension %i' % input_2)
-
- if not np.all(labels == 1.) and legend:
- ax.legend(loc=0, numpoints=1)
-
- ax.set_xlim(xmin[0], xmax[0])
- ax.set_ylim(xmin[1], xmax[1])
- ax.grid(b=False) # remove the grid if present, it doesn't look good
- ax.set_aspect('auto') # set a nice aspect ratio
-
- if plot_inducing:
- ax.plot(model.Z[:, input_1], model.Z[:, input_2], '^w')
-
- if updates:
- ax.figure.canvas.show()
- raw_input('Enter to continue')
-
- pb.title('Magnification Factor')
- return ax
diff --git a/GPy/util/visualize.py b/GPy/util/visualize.py
deleted file mode 100644
index 691326ac..00000000
--- a/GPy/util/visualize.py
+++ /dev/null
@@ -1,538 +0,0 @@
-import matplotlib.pyplot as plt
-from mpl_toolkits.mplot3d import Axes3D
-import GPy
-import numpy as np
-import matplotlib as mpl
-import time
-import Image
-try:
- import visual
- visual_available = True
-
-except ImportError:
- visual_available = False
-
-
-class data_show:
- """
- The data_show class is a base class which describes how to visualize a
- particular data set. For example, motion capture data can be plotted as a
- stick figure, or images are shown using imshow. This class enables latent
- to data visualizations for the GP-LVM.
- """
- def __init__(self, vals):
- self.vals = vals.copy()
- # If no axes are defined, create some.
-
- def modify(self, vals):
- raise NotImplementedError, "this needs to be implemented to use the data_show class"
-
- def close(self):
- raise NotImplementedError, "this needs to be implemented to use the data_show class"
-
-class vpython_show(data_show):
- """
- the vpython_show class is a base class for all visualization methods that use vpython to display. It is initialized with a scene. If the scene is set to None it creates a scene window.
- """
-
- def __init__(self, vals, scene=None):
- data_show.__init__(self, vals)
- # If no axes are defined, create some.
-
- if scene==None:
- self.scene = visual.display(title='Data Visualization')
- else:
- self.scene = scene
-
- def close(self):
- self.scene.exit()
-
-
-
-class matplotlib_show(data_show):
- """
- the matplotlib_show class is a base class for all visualization methods that use matplotlib. It is initialized with an axis. If the axis is set to None it creates a figure window.
- """
- def __init__(self, vals, axes=None):
- data_show.__init__(self, vals)
- # If no axes are defined, create some.
-
- if axes==None:
- fig = plt.figure()
- self.axes = fig.add_subplot(111)
- else:
- self.axes = axes
-
- def close(self):
- plt.close(self.axes.get_figure())
-
-class vector_show(matplotlib_show):
- """
- A base visualization class that just shows a data vector as a plot of
- vector elements alongside their indices.
- """
- def __init__(self, vals, axes=None):
- matplotlib_show.__init__(self, vals, axes)
- self.handle = self.axes.plot(np.arange(0, len(vals))[:, None], self.vals.T)[0]
-
- def modify(self, vals):
- self.vals = vals.copy()
- xdata, ydata = self.handle.get_data()
- self.handle.set_data(xdata, self.vals.T)
- self.axes.figure.canvas.draw()
-
-
-class lvm(matplotlib_show):
- def __init__(self, vals, model, data_visualize, latent_axes=None, sense_axes=None, latent_index=[0,1]):
- """Visualize a latent variable model
-
- :param model: the latent variable model to visualize.
- :param data_visualize: the object used to visualize the data which has been modelled.
- :type data_visualize: visualize.data_show type.
- :param latent_axes: the axes where the latent visualization should be plotted.
- """
- if vals == None:
- vals = model.X[0]
-
- matplotlib_show.__init__(self, vals, axes=latent_axes)
-
- if isinstance(latent_axes,mpl.axes.Axes):
- self.cid = latent_axes.figure.canvas.mpl_connect('button_press_event', self.on_click)
- self.cid = latent_axes.figure.canvas.mpl_connect('motion_notify_event', self.on_move)
- self.cid = latent_axes.figure.canvas.mpl_connect('axes_leave_event', self.on_leave)
- self.cid = latent_axes.figure.canvas.mpl_connect('axes_enter_event', self.on_enter)
- else:
- self.cid = latent_axes[0].figure.canvas.mpl_connect('button_press_event', self.on_click)
- self.cid = latent_axes[0].figure.canvas.mpl_connect('motion_notify_event', self.on_move)
- self.cid = latent_axes[0].figure.canvas.mpl_connect('axes_leave_event', self.on_leave)
- self.cid = latent_axes[0].figure.canvas.mpl_connect('axes_enter_event', self.on_enter)
-
- self.data_visualize = data_visualize
- self.model = model
- self.latent_axes = latent_axes
- self.sense_axes = sense_axes
- self.called = False
- self.move_on = False
- self.latent_index = latent_index
- self.latent_dim = model.input_dim
-
- # The red cross which shows current latent point.
- self.latent_values = vals
- self.latent_handle = self.latent_axes.plot([0],[0],'rx',mew=2)[0]
- self.modify(vals)
- self.show_sensitivities()
-
- def modify(self, vals):
- """When latent values are modified update the latent representation and ulso update the output visualization."""
- self.vals = vals.copy()
- y = self.model.predict(self.vals)[0]
- self.data_visualize.modify(y)
- self.latent_handle.set_data(self.vals[self.latent_index[0]], self.vals[self.latent_index[1]])
- self.axes.figure.canvas.draw()
-
-
- def on_enter(self,event):
- pass
- def on_leave(self,event):
- pass
-
- def on_click(self, event):
- print 'click!'
- if event.inaxes!=self.latent_axes: return
- self.move_on = not self.move_on
- self.called = True
-
- def on_move(self, event):
- if event.inaxes!=self.latent_axes: return
- if self.called and self.move_on:
- # Call modify code on move
- self.latent_values[self.latent_index[0]]=event.xdata
- self.latent_values[self.latent_index[1]]=event.ydata
- self.modify(self.latent_values)
-
- def show_sensitivities(self):
- # A click in the bar chart axis for selection a dimension.
- if self.sense_axes != None:
- self.sense_axes.cla()
- self.sense_axes.bar(np.arange(self.model.input_dim), self.model.input_sensitivity(), color='b')
-
- if self.latent_index[1] == self.latent_index[0]:
- self.sense_axes.bar(np.array(self.latent_index[0]), self.model.input_sensitivity()[self.latent_index[0]], color='y')
- self.sense_axes.bar(np.array(self.latent_index[1]), self.model.input_sensitivity()[self.latent_index[1]], color='y')
-
- else:
- self.sense_axes.bar(np.array(self.latent_index[0]), self.model.input_sensitivity()[self.latent_index[0]], color='g')
- self.sense_axes.bar(np.array(self.latent_index[1]), self.model.input_sensitivity()[self.latent_index[1]], color='r')
-
- self.sense_axes.figure.canvas.draw()
-
-
-class lvm_subplots(lvm):
- """
- latent_axes is a np array of dimension np.ceil(input_dim/2),
- one for each pair of the latent dimensions.
- """
- def __init__(self, vals, Model, data_visualize, latent_axes=None, sense_axes=None):
- self.nplots = int(np.ceil(Model.input_dim/2.))+1
- assert len(latent_axes)==self.nplots
- if vals==None:
- vals = Model.X[0, :]
- self.latent_values = vals
-
- for i, axis in enumerate(latent_axes):
- if i == self.nplots-1:
- if self.nplots*2!=Model.input_dim:
- latent_index = [i*2, i*2]
- lvm.__init__(self, self.latent_vals, Model, data_visualize, axis, sense_axes, latent_index=latent_index)
- else:
- latent_index = [i*2, i*2+1]
- lvm.__init__(self, self.latent_vals, Model, data_visualize, axis, latent_index=latent_index)
-
-
-
-class lvm_dimselect(lvm):
- """
- A visualizer for latent variable models which allows selection of the latent dimensions to use by clicking on a bar chart of their length scales.
-
- For an example of the visualizer's use try:
-
- GPy.examples.dimensionality_reduction.BGPVLM_oil()
-
- """
- def __init__(self, vals, model, data_visualize, latent_axes=None, sense_axes=None, latent_index=[0, 1], labels=None):
- if latent_axes==None and sense_axes==None:
- self.fig,(latent_axes,self.sense_axes) = plt.subplots(1,2)
- elif sense_axes==None:
- fig=plt.figure()
- self.sense_axes = fig.add_subplot(111)
- else:
- self.sense_axes = sense_axes
- self.labels = labels
- lvm.__init__(self,vals,model,data_visualize,latent_axes,sense_axes,latent_index)
- self.show_sensitivities()
- print "use left and right mouse butons to select dimensions"
-
-
- def on_click(self, event):
-
- if event.inaxes==self.sense_axes:
- new_index = max(0,min(int(np.round(event.xdata-0.5)),self.model.input_dim-1))
- if event.button == 1:
- # Make it red if and y-axis (red=port=left) if it is a left button click
- self.latent_index[1] = new_index
- else:
- # Make it green and x-axis (green=starboard=right) if it is a right button click
- self.latent_index[0] = new_index
-
- self.show_sensitivities()
-
- self.latent_axes.cla()
- self.model.plot_latent(which_indices=self.latent_index,
- ax=self.latent_axes, labels=self.labels)
- self.latent_handle = self.latent_axes.plot([0],[0],'rx',mew=2)[0]
- self.modify(self.latent_values)
-
- elif event.inaxes==self.latent_axes:
- self.move_on = not self.move_on
-
- self.called = True
-
-
-
- def on_leave(self,event):
- latent_values = self.latent_values.copy()
- y = self.model.predict(latent_values[None,:])[0]
- self.data_visualize.modify(y)
-
-
-
-class image_show(matplotlib_show):
- """Show a data vector as an image. This visualizer rehapes the output vector and displays it as an image.
-
- :param vals: the values of the output to display.
- :type vals: ndarray
- :param axes: the axes to show the output on.
- :type vals: axes handle
- :param dimensions: the dimensions that the image needs to be transposed to for display.
- :type dimensions: tuple
- :param transpose: whether to transpose the image before display.
- :type bool: default is False.
- :param order: whether array is in Fortan ordering ('F') or Python ordering ('C'). Default is python ('C').
- :type order: string
- :param invert: whether to invert the pixels or not (default False).
- :type invert: bool
- :param palette: a palette to use for the image.
- :param preset_mean: the preset mean of a scaled image.
- :type preset_mean: double
- :param preset_std: the preset standard deviation of a scaled image.
- :type preset_std: double"""
- def __init__(self, vals, axes=None, dimensions=(16,16), transpose=False, order='C', invert=False, scale=False, palette=[], preset_mean = 0., preset_std = -1., select_image=0):
- matplotlib_show.__init__(self, vals, axes)
- self.dimensions = dimensions
- self.transpose = transpose
- self.order = order
- self.invert = invert
- self.scale = scale
- self.palette = palette
- self.preset_mean = preset_mean
- self.preset_std = preset_std
- self.select_image = select_image # This is used when the y vector contains multiple images concatenated.
-
- self.set_image(self.vals)
- if not self.palette == []: # Can just show the image (self.set_image() took care of setting the palette)
- self.handle = self.axes.imshow(self.vals, interpolation='nearest')
- else: # Use a boring gray map.
- self.handle = self.axes.imshow(self.vals, cmap=plt.cm.gray, interpolation='nearest') # @UndefinedVariable
- plt.show()
-
- def modify(self, vals):
- self.set_image(vals.copy())
- self.handle.set_array(self.vals)
- self.axes.figure.canvas.draw()
-
- def set_image(self, vals):
- dim = self.dimensions[0] * self.dimensions[1]
- num_images = np.sqrt(vals[0,].size/dim)
- if num_images > 1 and num_images.is_integer(): # Show a mosaic of images
- num_images = np.int(num_images)
- self.vals = np.zeros((self.dimensions[0]*num_images, self.dimensions[1]*num_images))
- for iR in range(num_images):
- for iC in range(num_images):
- cur_img_id = iR*num_images + iC
- cur_img = np.reshape(vals[0,dim*cur_img_id+np.array(range(dim))], self.dimensions, order=self.order)
- first_row = iR*self.dimensions[0]
- last_row = (iR+1)*self.dimensions[0]
- first_col = iC*self.dimensions[1]
- last_col = (iC+1)*self.dimensions[1]
- self.vals[first_row:last_row, first_col:last_col] = cur_img
-
- else:
- self.vals = np.reshape(vals[0,dim*self.select_image+np.array(range(dim))], self.dimensions, order=self.order)
- if self.transpose:
- self.vals = self.vals.T
- # if not self.scale:
- # self.vals = self.vals
- if self.invert:
- self.vals = -self.vals
-
- # un-normalizing, for visualisation purposes:
- if self.preset_std >= 0: # The Mean is assumed to be in the range (0,255)
- self.vals = self.vals*self.preset_std + self.preset_mean
- # Clipping the values:
- self.vals[self.vals < 0] = 0
- self.vals[self.vals > 255] = 255
- else:
- self.vals = 255*(self.vals - self.vals.min())/(self.vals.max() - self.vals.min())
- if not self.palette == []: # applying using an image palette (e.g. if the image has been quantized)
- self.vals = Image.fromarray(self.vals.astype('uint8'))
- self.vals.putpalette(self.palette) # palette is a list, must be loaded before calling this function
-
-class mocap_data_show_vpython(vpython_show):
- """Base class for visualizing motion capture data using visual module."""
-
- def __init__(self, vals, scene=None, connect=None, radius=0.1):
- vpython_show.__init__(self, vals, scene)
- self.radius = radius
- self.connect = connect
- self.process_values()
- self.draw_edges()
- self.draw_vertices()
-
- def draw_vertices(self):
- self.spheres = []
- for i in range(self.vals.shape[0]):
- self.spheres.append(visual.sphere(pos=(self.vals[i, 0], self.vals[i, 2], self.vals[i, 1]), radius=self.radius))
- self.scene.visible=True
-
- def draw_edges(self):
- self.rods = []
- self.line_handle = []
- if not self.connect==None:
- self.I, self.J = np.nonzero(self.connect)
- for i, j in zip(self.I, self.J):
- pos, axis = self.pos_axis(i, j)
- self.rods.append(visual.cylinder(pos=pos, axis=axis, radius=self.radius))
-
- def modify_vertices(self):
- for i in range(self.vals.shape[0]):
- self.spheres[i].pos = (self.vals[i, 0], self.vals[i, 2], self.vals[i, 1])
-
- def modify_edges(self):
- self.line_handle = []
- if not self.connect==None:
- self.I, self.J = np.nonzero(self.connect)
- for rod, i, j in zip(self.rods, self.I, self.J):
- rod.pos, rod.axis = self.pos_axis(i, j)
-
- def pos_axis(self, i, j):
- pos = []
- axis = []
- pos.append(self.vals[i, 0])
- axis.append(self.vals[j, 0]-self.vals[i,0])
- pos.append(self.vals[i, 2])
- axis.append(self.vals[j, 2]-self.vals[i,2])
- pos.append(self.vals[i, 1])
- axis.append(self.vals[j, 1]-self.vals[i,1])
- return pos, axis
-
- def modify(self, vals):
- self.vals = vals.copy()
- self.process_values()
- self.modify_edges()
- self.modify_vertices()
-
- def process_values(self):
- raise NotImplementedError, "this needs to be implemented to use the data_show class"
-
-
-class mocap_data_show(matplotlib_show):
- """Base class for visualizing motion capture data."""
-
- def __init__(self, vals, axes=None, connect=None):
- if axes==None:
- fig = plt.figure()
- axes = fig.add_subplot(111, projection='3d')
- matplotlib_show.__init__(self, vals, axes)
-
- self.connect = connect
- self.process_values()
- self.initialize_axes()
- self.draw_vertices()
- self.finalize_axes()
- self.draw_edges()
- self.axes.figure.canvas.draw()
-
- def draw_vertices(self):
- self.points_handle = self.axes.scatter(self.vals[:, 0], self.vals[:, 1], self.vals[:, 2])
-
- def draw_edges(self):
- self.line_handle = []
- if not self.connect==None:
- x = []
- y = []
- z = []
- self.I, self.J = np.nonzero(self.connect)
- for i, j in zip(self.I, self.J):
- x.append(self.vals[i, 0])
- x.append(self.vals[j, 0])
- x.append(np.NaN)
- y.append(self.vals[i, 1])
- y.append(self.vals[j, 1])
- y.append(np.NaN)
- z.append(self.vals[i, 2])
- z.append(self.vals[j, 2])
- z.append(np.NaN)
- self.line_handle = self.axes.plot(np.array(x), np.array(y), np.array(z), 'b-')
-
- def modify(self, vals):
- self.vals = vals.copy()
- self.process_values()
- self.initialize_axes_modify()
- self.draw_vertices()
- self.finalize_axes_modify()
- self.draw_edges()
- self.axes.figure.canvas.draw()
-
- def process_values(self):
- raise NotImplementedError, "this needs to be implemented to use the data_show class"
-
- def initialize_axes(self):
- """Set up the axes with the right limits and scaling."""
- self.x_lim = np.array([self.vals[:, 0].min(), self.vals[:, 0].max()])
- self.y_lim = np.array([self.vals[:, 1].min(), self.vals[:, 1].max()])
- self.z_lim = np.array([self.vals[:, 2].min(), self.vals[:, 2].max()])
-
- def initialize_axes_modify(self):
- self.points_handle.remove()
- self.line_handle[0].remove()
-
- def finalize_axes(self):
- self.axes.set_xlim(self.x_lim)
- self.axes.set_ylim(self.y_lim)
- self.axes.set_zlim(self.z_lim)
- self.axes.auto_scale_xyz([-1., 1.], [-1., 1.], [-1.5, 1.5])
-
- #self.axes.set_aspect('equal')
- self.axes.autoscale(enable=False)
-
- def finalize_axes_modify(self):
- self.axes.set_xlim(self.x_lim)
- self.axes.set_ylim(self.y_lim)
- self.axes.set_zlim(self.z_lim)
-
-class stick_show(mocap_data_show):
- """Show a three dimensional point cloud as a figure. Connect elements of the figure together using the matrix connect."""
- def __init__(self, vals, connect=None, axes=None):
- mocap_data_show.__init__(self, vals, axes=axes, connect=connect)
-
- def process_values(self):
- self.vals = self.vals.reshape((3, self.vals.shape[1]/3)).T
-
-class skeleton_show(mocap_data_show):
- """data_show class for visualizing motion capture data encoded as a skeleton with angles."""
- def __init__(self, vals, skel, axes=None, padding=0):
- """data_show class for visualizing motion capture data encoded as a skeleton with angles.
- :param vals: set of modeled angles to use for printing in the axis when it's first created.
- :type vals: np.array
- :param skel: skeleton object that has the parameters of the motion capture skeleton associated with it.
- :type skel: mocap.skeleton object
- :param padding:
- :type int
- """
- self.skel = skel
- self.padding = padding
- connect = skel.connection_matrix()
- mocap_data_show.__init__(self, vals, axes=axes, connect=connect)
- def process_values(self):
- """Takes a set of angles and converts them to the x,y,z coordinates in the internal prepresentation of the class, ready for plotting.
-
- :param vals: the values that are being modelled."""
-
- if self.padding>0:
- channels = np.zeros((self.vals.shape[0], self.vals.shape[1]+self.padding))
- channels[:, 0:self.vals.shape[0]] = self.vals
- else:
- channels = self.vals
- vals_mat = self.skel.to_xyz(channels.flatten())
- self.vals = np.zeros_like(vals_mat)
- # Flip the Y and Z axes
- self.vals[:, 0] = vals_mat[:, 0].copy()
- self.vals[:, 1] = vals_mat[:, 2].copy()
- self.vals[:, 2] = vals_mat[:, 1].copy()
-
- def wrap_around(self, lim, connect):
- quot = lim[1] - lim[0]
- self.vals = rem(self.vals, quot)+lim[0]
- nVals = floor(self.vals/quot)
- for i in range(connect.shape[0]):
- for j in find(connect[i, :]):
- if nVals[i] != nVals[j]:
- connect[i, j] = False
- return connect
-
-
-def data_play(Y, visualizer, frame_rate=30):
- """Play a data set using the data_show object given.
-
- :Y: the data set to be visualized.
- :param visualizer: the data show objectwhether to display during optimisation
- :type visualizer: data_show
-
- Example usage:
-
- This example loads in the CMU mocap database (http://mocap.cs.cmu.edu) subject number 35 motion number 01. It then plays it using the mocap_show visualize object.
-
- .. code-block:: python
-
- data = GPy.util.datasets.cmu_mocap(subject='35', train_motions=['01'])
- Y = data['Y']
- Y[:, 0:3] = 0. # Make figure walk in place
- visualize = GPy.util.visualize.skeleton_show(Y[0, :], data['skel'])
- GPy.util.visualize.data_play(Y, visualize)
-
- """
-
-
- for y in Y:
- visualizer.modify(y[None, :])
- time.sleep(1./float(frame_rate))