From 2b74edca9d575e3d4374bb772f70bc90dfd285d1 Mon Sep 17 00:00:00 2001 From: mzwiessele Date: Mon, 5 Oct 2015 02:36:00 +0100 Subject: [PATCH] [plotting] magnification plot added --- GPy/models/gplvm.py | 17 +- GPy/plotting/__init__.py | 5 +- GPy/plotting/abstract_plotting_library.py | 15 +- GPy/plotting/gpy_plot/latent_plots.py | 161 +++++++++++++++++- GPy/plotting/gpy_plot/plot_util.py | 11 +- .../controllers/axis_event_controller.py | 0 .../controllers/imshow_controller.py | 7 +- GPy/plotting/matplot_dep/defaults.py | 7 +- .../matplot_dep/dim_reduction_plots.py | 2 +- .../latent_space_visualizations/__init__.py | 1 - .../controllers/__init__.py | 1 - GPy/plotting/matplot_dep/plot_definitions.py | 19 ++- .../baseline/gp_class_-failed-diff.png | Bin 1323 -> 1391 bytes .../baseline/gp_class_link-failed-diff.png | Bin 5264 -> 5381 bytes .../gp_class_raw_link-failed-diff.png | Bin 9898 -> 9946 bytes .../baseline/sparse_gp_class_-failed-diff.png | Bin 1587 -> 1675 bytes .../sparse_gp_class_link-failed-diff.png | Bin 5524 -> 5636 bytes .../sparse_gp_class_raw_link-failed-diff.png | Bin 9843 -> 9918 bytes 18 files changed, 205 insertions(+), 41 deletions(-) rename GPy/plotting/matplot_dep/{latent_space_visualizations => }/controllers/axis_event_controller.py (100%) rename GPy/plotting/matplot_dep/{latent_space_visualizations => }/controllers/imshow_controller.py (93%) delete mode 100644 GPy/plotting/matplot_dep/latent_space_visualizations/__init__.py delete mode 100644 GPy/plotting/matplot_dep/latent_space_visualizations/controllers/__init__.py diff --git a/GPy/models/gplvm.py b/GPy/models/gplvm.py index b0034663..6416847c 100644 --- a/GPy/models/gplvm.py +++ b/GPy/models/gplvm.py @@ -6,7 +6,6 @@ import numpy as np from .. import kern from ..core import GP, Param from ..likelihoods import Gaussian -from .. import util class GPLVM(GP): @@ -42,18 +41,4 @@ class GPLVM(GP): def parameters_changed(self): super(GPLVM, self).parameters_changed() - self.X.gradient = self.kern.gradients_X(self.grad_dict['dL_dK'], self.X, None) - - def plot_latent(self, labels=None, which_indices=None, - resolution=50, ax=None, marker='o', s=40, - fignum=None, legend=True, - plot_limits=None, - aspect='auto', updates=False, **kwargs): - import sys - assert "matplotlib" in sys.modules, "matplotlib package has not been imported." - from ..plotting.matplot_dep import dim_reduction_plots - - return dim_reduction_plots.plot_latent(self, labels, which_indices, - resolution, ax, marker, s, - fignum, False, legend, - plot_limits, aspect, updates, **kwargs) + self.X.gradient = self.kern.gradients_X(self.grad_dict['dL_dK'], self.X, None) \ No newline at end of file diff --git a/GPy/plotting/__init__.py b/GPy/plotting/__init__.py index 4971620a..0b6c9c89 100644 --- a/GPy/plotting/__init__.py +++ b/GPy/plotting/__init__.py @@ -36,7 +36,7 @@ if config.get('plotting', 'library') is not 'none': GP.plot_samples = gpy_plot.gp_plots.plot_samples GP.plot = gpy_plot.gp_plots.plot GP.plot_f = gpy_plot.gp_plots.plot_f - #GP.plot_magnificaion = gpy_plot.latent_plots.plot_magnification + GP.plot_magnificaion = gpy_plot.latent_plots.plot_magnification from ..core import SparseGP SparseGP.plot_inducing = gpy_plot.data_plots.plot_inducing @@ -49,8 +49,9 @@ if config.get('plotting', 'library') is not 'none': #Kern.plot_covariance = gpy_plot.kern_plots.plot_kern # Variational plot! + - from . import matplot_dep + #from . import matplot_dep # Still to convert to new style: #GP.plot = matplot_dep.models_plots.plot_fit #GP.plot_f = matplot_dep.models_plots.plot_fit_f diff --git a/GPy/plotting/abstract_plotting_library.py b/GPy/plotting/abstract_plotting_library.py index f09f8d3c..a03d8591 100644 --- a/GPy/plotting/abstract_plotting_library.py +++ b/GPy/plotting/abstract_plotting_library.py @@ -57,7 +57,7 @@ class AbstractPlottingLibrary(object): return self.__defaults #=============================================================================== - def get_new_canvas(self, plot_3d=False, xlabel=None, ylabel=None, zlabel=None, title=None, legend=True, **kwargs): + def get_new_canvas(self, xlabel=None, ylabel=None, zlabel=None, title=None, projection='2d', legend=True, **kwargs): """ Return a canvas, kwargupdate for your plotting library. @@ -174,10 +174,17 @@ class AbstractPlottingLibrary(object): """ raise NotImplementedError("Implement all plot functions in AbstractPlottingLibrary in order to use your own plotting library") - def imshow(self, canvas, X, label=None, color=None, **kwargs): + def imshow(self, canvas, X, extent=None, label=None, plot_function=None, vmin=None, vmax=None, **kwargs): """ - Show the image stored in X on the canvas/ - + Show the image stored in X on the canvas. + + if X is a function, create an imshow controller to stream + the image. There is an imshow controller written for + mmatplotlib, which updates the imshow on changes in axis. + + Just ignore the plot_function, if you do not have the option + to have interactive changes. + the kwargs are plotting library specific kwargs! """ raise NotImplementedError("Implement all plot functions in AbstractPlottingLibrary in order to use your own plotting library") diff --git a/GPy/plotting/gpy_plot/latent_plots.py b/GPy/plotting/gpy_plot/latent_plots.py index 292cbd0e..23235c44 100644 --- a/GPy/plotting/gpy_plot/latent_plots.py +++ b/GPy/plotting/gpy_plot/latent_plots.py @@ -32,6 +32,7 @@ from . import pl from .plot_util import get_x_y_var, get_free_dims, get_which_data_ycols,\ get_which_data_rows, update_not_existing_kwargs, helper_predict_with_model,\ helper_for_plot_data +import itertools def plot_prediction_fit(self, plot_limits=None, which_data_rows='all', which_data_ycols='all', @@ -102,6 +103,164 @@ def _plot_prediction_fit(self, canvas, plot_limits=None, raise NotImplementedError("Cannot plot in more then one dimension.") return plots +def plot_magnification(self, labels=None, which_indices=None, + resolution=60, legend=True, + plot_limits=None, + updates=False, + mean=True, covariance=True, + kern=None, marker='<>^vsd', imshow_kwargs=None, **kwargs): + """ + Plot the magnification factor of the GP on the inputs. This is the + density of the GP as a gray scale. + + :param array-like labels: a label for each data point (row) of the inputs + :param (int, int) which_indices: which input dimensions to plot against each other + :param int resolution: the resolution at which we predict the magnification factor + :param bool legend: whether to plot the legend on the figure + :param plot_limits: the plot limits for the plot + :type plot_limits: (xmin, xmax, ymin, ymax) or ((xmin, xmax), (ymin, ymax)) + :param bool updates: if possible, make interactive updates using the specific library you are using + :param bool mean: use the mean of the Wishart embedding for the magnification factor + :param bool covariance: use the covariance of the Wishart embedding for the magnification factor + :param :py:class:`~GPy.kern.Kern` kern: the kernel to use for prediction + :param str marker: markers to use - cycle if more labels then markers are given + :param imshow_kwargs: the kwargs for the imshow (magnification factor) + :param kwargs: the kwargs for the scatter plots + """ + input_1, input_2 = self.get_most_significant_input_dimensions(which_indices) + + #fethch the data points X that we'd like to plot + X, _, _ = get_x_y_var(self) + + if plot_limits is None: + xmin, ymin = X[:, [input_1, input_2]].min(0) + xmax, ymax = X[:, [input_1, input_2]].max(0) + x_r, y_r = xmax-xmin, ymax-ymin + xmin -= .1*x_r + xmax += .1*x_r + ymin -= .1*y_r + ymax += .1*y_r + else: + try: + xmin, xmax, ymin, ymax = plot_limits + except (TypeError, ValueError) as e: + try: + xmin, xmax = plot_limits + ymin, ymax = xmin, xmax + except (TypeError, ValueError) as e: + raise e.__class__("Wrong plot limits: {} given -> need (xmin, xmax, ymin, ymax)".format(plot_limits)) + xlim = (xmin, xmax) + ylim = (ymin, ymax) + + from .. import Tango + Tango.reset() + + if labels is None: + labels = np.ones(self.num_data) + + if X.shape[0] > 1000: + print("Warning: subsampling X, as it has more samples then 1000. X.shape={!s}".format(X.shape)) + subsample = np.random.choice(X.shape[0], size=1000, replace=False) + X = X[subsample] + labels = labels[subsample] + #======================================================================= + # <<>> + # <<>> + # plt.close('all') + # fig, ax = plt.subplots(1,1) + # from GPy.plotting.matplot_dep.dim_reduction_plots import most_significant_input_dimensions + # import matplotlib.patches as mpatches + # i1, i2 = most_significant_input_dimensions(m, None) + # xmin, xmax = 100, -100 + # ymin, ymax = 100, -100 + # legend_handles = [] + # + # X = m.X.mean[:, [i1, i2]] + # X = m.X.variance[:, [i1, i2]] + # + # xmin = X[:,0].min(); xmax = X[:,0].max() + # ymin = X[:,1].min(); ymax = X[:,1].max() + # range_ = [[xmin, xmax], [ymin, ymax]] + # ul = np.unique(labels) + # + # for i, l in enumerate(ul): + # #cdict = dict(red =[(0., colors[i][0], colors[i][0]), (1., colors[i][0], colors[i][0])], + # # green=[(0., colors[i][0], colors[i][1]), (1., colors[i][1], colors[i][1])], + # # blue =[(0., colors[i][0], colors[i][2]), (1., colors[i][2], colors[i][2])], + # # alpha=[(0., 0., .0), (.5, .5, .5), (1., .5, .5)]) + # #cmap = LinearSegmentedColormap('{}'.format(l), cdict) + # cmap = LinearSegmentedColormap.from_list('cmap_{}'.format(str(l)), [colors[i], colors[i]], 255) + # cmap._init() + # #alphas = .5*(1+scipy.special.erf(np.linspace(-2,2, cmap.N+3)))#np.log(np.linspace(np.exp(0), np.exp(1.), cmap.N+3)) + # alphas = (scipy.special.erf(np.linspace(0,2.4, cmap.N+3)))#np.log(np.linspace(np.exp(0), np.exp(1.), cmap.N+3)) + # cmap._lut[:, -1] = alphas + # print l + # x, y = X[labels==l].T + # + # heatmap, xedges, yedges = np.histogram2d(x, y, bins=300, range=range_) + # #heatmap, xedges, yedges = np.histogram2d(x, y, bins=100) + # + # im = ax.imshow(heatmap, extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]], cmap=cmap, aspect='auto', interpolation='nearest', label=str(l)) + # legend_handles.append(mpatches.Patch(color=colors[i], label=l)) + # ax.set_xlim(xmin, xmax) + # ax.set_ylim(ymin, ymax) + # plt.legend(legend_handles, [l.get_label() for l in legend_handles]) + # plt.draw() + # plt.show() + #======================================================================= - \ No newline at end of file + canvas, kwargs = pl.get_new_canvas(xlabel='latent dimension %i' % input_1, ylabel='latent dimension %i' % input_2, **kwargs) + + _, _, _, _, _, Xgrid, _, _, _, _, resolution = helper_for_plot_data(self, ((xmin, ymin), (xmax, ymax)), (input_1, input_2), None, resolution) + + def plot_function(x): + Xtest_full = np.zeros((x.shape[0], X.shape[1])) + Xtest_full[:, [input_1, input_2]] = x + mf = self.predict_magnification(Xtest_full, kern=kern, mean=mean, covariance=covariance) + return mf + + imshow_kwargs = update_not_existing_kwargs(imshow_kwargs, pl.defaults.magnification) + Y = plot_function(Xgrid[:, [input_1, input_2]]).reshape(resolution, resolution).T[::-1, :] + view = pl.imshow(canvas, Y, + (xmin, ymin, xmax, ymax), + None, plot_function, resolution, + vmin=Y.min(), vmax=Y.max(), + **imshow_kwargs) + + # 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)) + scatters = [] + + for ul in ulabels: + if type(ul) is np.string_: + this_label = ul + elif type(ul) is np.int64: + this_label = 'class %i' % ul + else: + this_label = unicode(ul) + m = marker.next() + + index = np.nonzero(labels == ul)[0] + if self.input_dim == 1: + x = X[index, input_1] + y = np.zeros(index.size) + else: + x = X[index, input_1] + y = X[index, input_2] + update_not_existing_kwargs(kwargs, pl.defaults.latent_scatter) + scatters.append(pl.scatter(canvas, x, y, marker=m, color=Tango.nextMedium(), label=this_label, **kwargs)) + + plots = pl.show_canvas(canvas, dict(scatter=scatters, imshow=view), legend=legend, xlim=xlim, ylim=ylim) + if updates: + clear = raw_input('yes or enter to deactivate updates - otherwise still do updates - use plots[imshow].deactivate() to clear') + if clear.lower() in 'yes' or clear == '': + view.deactivate() + else: + view.deactivate() + return plots diff --git a/GPy/plotting/gpy_plot/plot_util.py b/GPy/plotting/gpy_plot/plot_util.py index 1a9b2a92..0defc9df 100644 --- a/GPy/plotting/gpy_plot/plot_util.py +++ b/GPy/plotting/gpy_plot/plot_util.py @@ -125,7 +125,10 @@ def update_not_existing_kwargs(to_update, update_from): This is used for updated kwargs from the default dicts. """ - return to_update.update({k:v for k,v in update_from.items() if k not in to_update}) + if to_update is None: + to_update = {} + to_update.update({k:v for k,v in update_from.items() if k not in to_update}) + return to_update def get_x_y_var(model): """ @@ -208,12 +211,14 @@ 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" + 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 = 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 + elif len(plot_limits)==4: + xmin, xmax = (plot_limits[0], plot_limits[2]), (plot_limits[1], plot_limits[3]) else: raise ValueError("Bad limits for plotting") diff --git a/GPy/plotting/matplot_dep/latent_space_visualizations/controllers/axis_event_controller.py b/GPy/plotting/matplot_dep/controllers/axis_event_controller.py similarity index 100% rename from GPy/plotting/matplot_dep/latent_space_visualizations/controllers/axis_event_controller.py rename to GPy/plotting/matplot_dep/controllers/axis_event_controller.py diff --git a/GPy/plotting/matplot_dep/latent_space_visualizations/controllers/imshow_controller.py b/GPy/plotting/matplot_dep/controllers/imshow_controller.py similarity index 93% rename from GPy/plotting/matplot_dep/latent_space_visualizations/controllers/imshow_controller.py rename to GPy/plotting/matplot_dep/controllers/imshow_controller.py index 87f7df7b..9d941073 100644 --- a/GPy/plotting/matplot_dep/latent_space_visualizations/controllers/imshow_controller.py +++ b/GPy/plotting/matplot_dep/controllers/imshow_controller.py @@ -22,11 +22,10 @@ class ImshowController(BufferedAxisChangedController): """ super(ImshowController, self).__init__(ax, plot_function, plot_limits, resolution, update_lim, **kwargs) - def _init_view(self, canvas, X, xmin, xmax, ymin, ymax, **kwargs): - return pl.imshow(canvas, X, extent=(xmin, xmax, + def _init_view(self, canvas, X, xmin, xmax, ymin, ymax, vmin=None, vmax=None, **kwargs): + return canvas.imshow(X, extent=(xmin, xmax, ymin, ymax), - vmin=X.min(), - vmax=X.max(), + vmin=vmin, vmax=vmax, **kwargs) def update_view(self, view, X, xmin, xmax, ymin, ymax): diff --git a/GPy/plotting/matplot_dep/defaults.py b/GPy/plotting/matplot_dep/defaults.py index f074fc55..5e8d84e9 100644 --- a/GPy/plotting/matplot_dep/defaults.py +++ b/GPy/plotting/matplot_dep/defaults.py @@ -65,4 +65,9 @@ data_y_1d = dict(linewidth=0, cmap='RdBu', s=40) data_y_1d_plot = dict(color='k', linewidth=1.5) # Kernel plots: -ard = dict(edgecolor='k', linewidth=1.2) \ No newline at end of file +ard = dict(edgecolor='k', linewidth=1.2) + +# Input plots: +latent = dict(aspect='auto', cmap='Greys', interpolation='bilinear') +magnification = dict(aspect='auto', cmap='Greys', interpolation='bilinear') +latent_scatter = dict(s=40, linewidth=.2, edgecolor='k', alpha=.9) \ No newline at end of file diff --git a/GPy/plotting/matplot_dep/dim_reduction_plots.py b/GPy/plotting/matplot_dep/dim_reduction_plots.py index be7d032f..25b5d45b 100644 --- a/GPy/plotting/matplot_dep/dim_reduction_plots.py +++ b/GPy/plotting/matplot_dep/dim_reduction_plots.py @@ -7,7 +7,7 @@ from ...core.parameterization.variational import VariationalPosterior from .base_plots import x_frame2D import itertools try: -from GPy.plotting import Tango + from GPy.plotting import Tango from matplotlib.cm import get_cmap from matplotlib import pyplot as pb from matplotlib import cm diff --git a/GPy/plotting/matplot_dep/latent_space_visualizations/__init__.py b/GPy/plotting/matplot_dep/latent_space_visualizations/__init__.py deleted file mode 100644 index 4644261c..00000000 --- a/GPy/plotting/matplot_dep/latent_space_visualizations/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .import controllers diff --git a/GPy/plotting/matplot_dep/latent_space_visualizations/controllers/__init__.py b/GPy/plotting/matplot_dep/latent_space_visualizations/controllers/__init__.py deleted file mode 100644 index f59b71ba..00000000 --- a/GPy/plotting/matplot_dep/latent_space_visualizations/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import axis_event_controller, imshow_controller diff --git a/GPy/plotting/matplot_dep/plot_definitions.py b/GPy/plotting/matplot_dep/plot_definitions.py index 174d0cd3..f1fca71a 100644 --- a/GPy/plotting/matplot_dep/plot_definitions.py +++ b/GPy/plotting/matplot_dep/plot_definitions.py @@ -33,13 +33,14 @@ from ..abstract_plotting_library import AbstractPlottingLibrary from .. import Tango from . import defaults from matplotlib.colors import LinearSegmentedColormap +from .controllers.imshow_controller import ImshowController class MatplotlibPlots(AbstractPlottingLibrary): def __init__(self): super(MatplotlibPlots, self).__init__() self._defaults = defaults.__dict__ - def get_new_canvas(self, xlabel=None, ylabel=None, zlabel=None, title=None, legend=True, projection='2d', **kwargs): + def get_new_canvas(self, xlabel=None, ylabel=None, zlabel=None, title=None, projection='2d', **kwargs): if projection == '3d': from mpl_toolkits.mplot3d import Axes3D elif projection == '2d': @@ -61,22 +62,23 @@ class MatplotlibPlots(AbstractPlottingLibrary): if title is not None: ax.set_title(title) return ax, kwargs - def show_canvas(self, ax, plots, xlim=None, ylim=None, zlim=None, **kwargs): + def show_canvas(self, ax, plots, xlim=None, ylim=None, zlim=None, legend=True, **kwargs): try: ax.autoscale_view() ax.set_xlim(xlim) ax.set_ylim(ylim) + if legend: + ax.legend() if zlim is not None: ax.set_zlim(zlim) ax.figure.canvas.draw() - #ax.figure.tight_layout() except: pass return plots - def scatter(self, ax, X, Y, Z=None, color=Tango.colorsHex['mediumBlue'], label=None, **kwargs): + def scatter(self, ax, X, Y, Z=None, color=Tango.colorsHex['mediumBlue'], label=None, marker='o', **kwargs): if Z is not None: - return ax.scatter(X, Y, c=color, zs=Z, label=label, **kwargs) + return ax.scatter(X, Y, c=color, zs=Z, label=label, marker=marker, **kwargs) return ax.scatter(X, Y, c=color, label=label, **kwargs) def plot(self, ax, X, Y, color=None, label=None, **kwargs): @@ -116,8 +118,11 @@ class MatplotlibPlots(AbstractPlottingLibrary): return ax.errorbar(X, Y, Z, yerr=error, ecolor=color, label=label, **kwargs) return ax.errorbar(X, Y, yerr=error, ecolor=color, label=label, **kwargs) - def imshow(self, ax, X, label=None, **kwargs): - return ax.imshow(X, label=label, **kwargs) + def imshow(self, ax, X, extent=None, label=None, plot_function=None, resolution=None, vmin=None, vmax=None, **kwargs): + if plot_function is not None: + self.controller = ImshowController(ax, plot_function, extent, resolution=resolution, vmin=vmin, vmax=vmax, **kwargs) + return self.controller + return ax.imshow(X, label=label, extent=extent, vmin=vmin, vmax=vmax, **kwargs) def contour(self, ax, X, Y, C, levels=20, label=None, **kwargs): return ax.contour(X, Y, C, levels=np.linspace(C.min(), C.max(), levels), label=label, **kwargs) diff --git a/GPy/testing/plotting_tests/baseline/gp_class_-failed-diff.png b/GPy/testing/plotting_tests/baseline/gp_class_-failed-diff.png index 6ec4e8562c5402aa1d6a54219d392e0a6844645a..e6f3f30875354e1014e584a5eaa521cc43c87973 100644 GIT binary patch literal 1391 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNIvi|3k+<8Q9s*J<#ZI0f96(URkbz7g^d{fC^;GP^g z?XP`p%&U&pT{{2cW;~r$t@B{VUuB?z{V&dNy6_+jkc%pI5pPIAM z2WA?twR|@-T}$r!Lu+6f&j+S^CME}^VL*LiKWQD&HL3k(Kd=O4@O1TaS?83{1OO;T BI{g3u literal 1323 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKNIvi|3k+<8Q9s*J<#ZI0f96(URk?rahBL=4Gh3Fn=*S!-H8Y zEDbIW3?9RQ`X^`0a62k{@0VZ2=a%m)KKJw8-|g$l*N3k!?fL(F@7G(#*$vv8nG?gS z|Gdn9d2LU4H1nRW28Ib7C-^^~dOYR)y4d}nZ$_RkC@E=^e4tU>lW4!s&|Rh=SB~dh zGCPxlk^+MY6Wypy8@FD&sLb%j$-zuT?m#}+@=XgZpM%8Q9L&^|4&*D+)j@Rg`9N9p z;b7G37lL|@;LPx#85GnpO`zn#!O%Hy)EUELR#hAp-CKX1Pdr!ogQxmO*4+DN|GnS* zeNEx&-zQ(+Xau>iCh1&d*YXGJ(|+XbQ+{6m R9kBFc@O1TaS?83{1OOIV91j2h diff --git a/GPy/testing/plotting_tests/baseline/gp_class_link-failed-diff.png b/GPy/testing/plotting_tests/baseline/gp_class_link-failed-diff.png index 937b5daec6bd85571f3b36b7372ed10f55199f6a..26a94894e8e6749fcda2b92ad5e13f6cd4a0f4f7 100644 GIT binary patch literal 5381 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

q-s+sM9^td$TY*|KL84bB`55`_@5jNM2z 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 diff --git a/GPy/testing/plotting_tests/baseline/gp_class_raw_link-failed-diff.png b/GPy/testing/plotting_tests/baseline/gp_class_raw_link-failed-diff.png index b8c957bd30c45dd883ffd5848b362d4d0e2a257d..6222d49f708818af2831ff7b57bed19ceed20988 100644 GIT binary patch delta 7866 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 delta 7792 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 TQlk&71sFVC{an^LB{Ts5)@s0? diff --git a/GPy/testing/plotting_tests/baseline/sparse_gp_class_link-failed-diff.png b/GPy/testing/plotting_tests/baseline/sparse_gp_class_link-failed-diff.png index 35abbd302aed9f27fb99afa2e68840edc0706bff..0e6e5adcdf1fcf101309c532126db056d8440384 100644 GIT binary patch literal 5636 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 B;qL$d literal 5524 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 MT6&t5>bB4R7h^s5OaK4? literal 9843 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 Y3R{}rQ~Yj7>LLR?(9lt@P_>QvA4VqzivR!s