How to make a 4d plot with matplotlib using arbitrary data
Question: This question is related to this
[one](http://stackoverflow.com/questions/7855229/how-to-make-a-4d-plot-using-
python-with-matplotlib).

What I would like to know is how to apply the suggested solution to a bunch of
data (4 columns), e.g.:

    
    
    0.1 0 0.1 2.0
    0.1 0 1.1 -0.498121712998
    0.1 0 2.1 -0.49973005075
    0.1 0 3.1 -0.499916082038
    0.1 0 4.1 -0.499963726586
    0.1 1 0.1 -0.0181405895692
    0.1 1 1.1 -0.490774988618
    0.1 1 2.1 -0.498653742846
    0.1 1 3.1 -0.499580747953
    0.1 1 4.1 -0.499818696063
    0.1 2 0.1 -0.0107079119572
    0.1 2 1.1 -0.483641823093
    0.1 2 2.1 -0.497582061233
    0.1 2 3.1 -0.499245863438
    0.1 2 4.1 -0.499673749657
    0.1 3 0.1 -0.0075248589089
    0.1 3 1.1 -0.476713038166
    0.1 3 2.1 -0.49651497615
    0.1 3 3.1 -0.498911427589
    0.1 3 4.1 -0.499528887295
    0.1 4 0.1 -0.00579180003048
    0.1 4 1.1 -0.469979974092
    0.1 4 2.1 -0.495452458086
    0.1 4 3.1 -0.498577439505
    0.1 4 4.1 -0.499384108904
    1.1 0 0.1 302.0
    1.1 0 1.1 -0.272727272727
    1.1 0 2.1 -0.467336140806
    1.1 0 3.1 -0.489845926622
    1.1 0 4.1 -0.495610916847
    1.1 1 0.1 -0.000154915998165
    1.1 1 1.1 -0.148803329865
    1.1 1 2.1 -0.375881358454
    1.1 1 3.1 -0.453749548548
    1.1 1 4.1 -0.478942841849
    1.1 2 0.1 -9.03765566114e-05
    1.1 2 1.1 -0.0972702806613
    1.1 2 2.1 -0.314291859842
    1.1 2 3.1 -0.422606253083
    1.1 2 4.1 -0.463359353084
    1.1 3 0.1 -6.31234088628e-05
    1.1 3 1.1 -0.0720095219203
    1.1 3 2.1 -0.270015786897
    1.1 3 3.1 -0.395462300716
    1.1 3 4.1 -0.44875793248
    1.1 4 0.1 -4.84199181874e-05
    1.1 4 1.1 -0.0571187054704
    1.1 4 2.1 -0.236660992042
    1.1 4 3.1 -0.371593983211
    1.1 4 4.1 -0.4350485869
    2.1 0 0.1 1102.0
    2.1 0 1.1 0.328324567994
    2.1 0 2.1 -0.380952380952
    2.1 0 3.1 -0.462992178846
    2.1 0 4.1 -0.48400342421
    2.1 1 0.1 -4.25137933034e-05
    2.1 1 1.1 -0.0513190921508
    2.1 1 2.1 -0.224866151101
    2.1 1 3.1 -0.363752470126
    2.1 1 4.1 -0.430700436658
    2.1 2 0.1 -2.48003822279e-05
    2.1 2 1.1 -0.0310025255124
    2.1 2 2.1 -0.158022037087
    2.1 2 3.1 -0.29944612818
    2.1 2 4.1 -0.387965424205
    2.1 3 0.1 -1.73211484062e-05
    2.1 3 1.1 -0.0220466245862
    2.1 3 2.1 -0.12162780064
    2.1 3 3.1 -0.254424041889
    2.1 3 4.1 -0.35294082311
    2.1 4 0.1 -1.32862131387e-05
    2.1 4 1.1 -0.0170828002197
    2.1 4 2.1 -0.0988138417802
    2.1 4 3.1 -0.221154587294
    2.1 4 4.1 -0.323713596671
    3.1 0 0.1 2402.0
    3.1 0 1.1 1.30503380917
    3.1 0 2.1 -0.240578771191
    3.1 0 3.1 -0.41935483871
    3.1 0 4.1 -0.465141248676
    3.1 1 0.1 -1.95102493785e-05
    3.1 1 1.1 -0.0248114638773
    3.1 1 2.1 -0.135153019304
    3.1 1 3.1 -0.274125336409
    3.1 1 4.1 -0.36965644171
    3.1 2 0.1 -1.13811197906e-05
    3.1 2 1.1 -0.0147116366819
    3.1 2 2.1 -0.0872950700627
    3.1 2 3.1 -0.202935925412
    3.1 2 4.1 -0.306612285308
    3.1 3 0.1 -7.94877050259e-06
    3.1 3 1.1 -0.0103624783432
    3.1 3 2.1 -0.0642253568271
    3.1 3 3.1 -0.160970897235
    3.1 3 4.1 -0.261906474418
    3.1 4 0.1 -6.09709039262e-06
    3.1 4 1.1 -0.00798626913355
    3.1 4 2.1 -0.0507564081263
    3.1 4 3.1 -0.133349565782
    3.1 4 4.1 -0.228563754423
    4.1 0 0.1 4202.0
    4.1 0 1.1 2.65740045079
    4.1 0 2.1 -0.0462153115214
    4.1 0 3.1 -0.358933906213
    4.1 0 4.1 -0.439024390244
    4.1 1 0.1 -1.11538537794e-05
    4.1 1 1.1 -0.0144619860317
    4.1 1 2.1 -0.0868190343718
    4.1 1 3.1 -0.203767982755
    4.1 1 4.1 -0.308519215265
    4.1 2 0.1 -6.50646078271e-06
    4.1 2 1.1 -0.0085156584289
    4.1 2 2.1 -0.0538784714494
    4.1 2 3.1 -0.140215240068
    4.1 2 4.1 -0.23746380125
    4.1 3 0.1 -4.54421180079e-06
    4.1 3 1.1 -0.00597669061814
    4.1 3 2.1 -0.038839789599
    4.1 3 3.1 -0.106675396816
    4.1 3 4.1 -0.192922262523
    4.1 4 0.1 -3.48562423225e-06
    4.1 4 1.1 -0.00459693165308
    4.1 4 2.1 -0.0303305231375
    4.1 4 3.1 -0.0860368842133
    4.1 4 4.1 -0.162420599686
    

The solution to the initial problem is:

    
    
    # Python-matplotlib Commands
    from mpl_toolkits.mplot3d import Axes3D
    from matplotlib import cm
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    X = np.arange(-5, 5, .25)
    Y = np.arange(-5, 5, .25)
    X, Y = np.meshgrid(X, Y)
    R = np.sqrt(X**2 + Y**2)
    Z = np.sin(R)
    Gx, Gy = np.gradient(Z) # gradients with respect to x and y
    G = (Gx**2+Gy**2)**.5  # gradient magnitude
    N = G/G.max()  # normalize 0..1
    surf = ax.plot_surface(
        X, Y, Z, rstride=1, cstride=1,
        facecolors=cm.jet(N),
        linewidth=0, antialiased=False, shade=False)
    plt.show()
    

As far as I can see, and this applies to all matplotlib-demos, the variables
X, Y and Z are nicely prepared. In practical cases this is not always the
case.

Ideas how to reuse the given solution with arbitrary data?


Answer: Great question Tengis, all the math folks love to show off the flashy surface
plots with functions given, while leaving out dealing with real world data.
The sample code you provided uses gradients since the relationships of a
variables are modeled using functions. For this example I will generate random
data using a standard normal distribution.

Anyways here is how you can quickly plot 4D random (arbitrary) data with first
three variables are on the axis and the fourth being color:

    
    
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    x = np.random.standard_normal(100)
    y = np.random.standard_normal(100)
    z = np.random.standard_normal(100)
    c = np.random.standard_normal(100)
    
    ax.scatter(x, y, z, c=c, cmap=plt.hot())
    plt.show()
    

Note: A heatmap with the hot color scheme (yellow to red) was used for the 4th
dimension

Result:  
[![enter image description
here](http://i.stack.imgur.com/DCywo.png)](http://i.stack.imgur.com/DCywo.png)

