Plot linear model in 3d with Matplotlib
Question: I'm trying to create a 3d plot of a linear model fit for a data set. I was
able to do this relatively easily in R, but I'm really struggling to do the
same in Python. Here is what I've done in R:

![3d plot](http://i.stack.imgur.com/etOb8.png)

Here's what I've done in Python:

    
    
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import statsmodels.formula.api as sm
    
    csv = pd.read_csv('http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv', index_col=0)
    model = sm.ols(formula='Sales ~ TV + Radio', data = csv)
    fit = model.fit()
    
    fit.summary()
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    ax.scatter(csv['TV'], csv['Radio'], csv['Sales'], c='r', marker='o')
    
    xx, yy = np.meshgrid(csv['TV'], csv['Radio'])
    
    # Not what I expected :(
    # ax.plot_surface(xx, yy, fit.fittedvalues)
    
    ax.set_xlabel('TV')
    ax.set_ylabel('Radio')
    ax.set_zlabel('Sales')
    
    plt.show()
    

What am I doing wrong and what should I do instead?

Thank you.


Answer: You were correct in assuming that plot_surface wants a meshgrid of coordinates
to work with, but predict wants a data structure like the one you fitted with
(the "exog").

    
    
    exog = pd.core.frame.DataFrame({'TV':xx.ravel(),'Radio':yy.ravel()})
    out = fit.predict(exog=exog)
    ax.plot_surface(xx, yy, out.reshape(xx.shape), color='None')
    

