Cannot find plot function in GPy library (python)
Question: I am using the [GPy](https://github.com/SheffieldML/GPy "GPy") library in
Python 2.7 to perform Gaussian Process regressions. I started by following the
tutorial notebooks provided in the GitHub page.

Sample code :

    
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    f = lambda x : np.sin(x**2)
    
    kernel = GPy.kern.RBF(input_dim=1, variance=1., lengthscale=1.)
    
    X=np.random.rand(2,1)
    Y=f(X)
    
    m = GPy.models.GPRegression(X,Y,kernel)
    m.optimize_restarts(num_restarts = 10,verbose=False)
    
    fig=m.plot()
    plt.show()
    

The weird thing I witnessed is that there is no **plot** function implemented
in the **GPRegression** class (_ok, it's just a small sub-class of**GP**._),
nor in its super-class (**GP**), nor in its super-super-class (**Model**)...
all located in **GPy.core**.

The plot function that is executed when I call **m.plot()** is in
**GPy.plotting.gpy_plot** (which does not contain any class, but still uses
the "self" keyword as function argument - but maybe it's just a "bad" name for
a function argument ?).

I cannot see how a **GPy.core.GP** object can access this plot function (at
first sight, there is no link whatsoever between the two python files - Ctrl+F
"plot" in **GPy/core/gp.py** gives nothing for example).

When I call

    
    
    vars(GPy.models.gp_regression.GP).keys()
    

, the plot function is indeed there, although not directly implemented in
**GPy.core.GP**.

Same thing for : (Minimal reproducible example)

    
    
    import GPy.core.gp
    import GPy.likelihoods
    import GPy.kern
    import matplotlib.pyplot as plt
    
    GPy.core.gp.GP.__dict__.keys()
    

Any idea of _how_ **GP** calls the plot function in **gpy_plot** , and _why_
it is coded this way ?


Answer: The plotting library gets "injected" in GPy/GPy/plotting/__init__.py's
[`inject_plotting()`](https://github.com/SheffieldML/GPy/blob/v1.0.9/GPy/plotting/__init__.py#L36).
Here the line for `plot()`:

    
    
        from ..core import GP
        ...
        GP.plot = gpy_plot.gp_plots.plot
    

I assume the reason for this design was that it allows easily changing the
plotting library _on-the-fly_ via
[`change_plotting_library()`](https://github.com/SheffieldML/GPy/blob/v1.0.9/GPy/plotting/__init__.py#L8).

