Search code examples
numpymatplotlibmplot3d

Plot 2D array of (x,y,z) points in 3D space (Matplotlib)


I'm a beginner in Python and specially in Matplotlib. I have a 22797x3 array, built from a multiplication between two other arrays, one 22797x400 long and the other 400x3 long. In the resulted array (22797x3),each line represents a point with (x,y,z) coordinates, hence the 3 columns. How could I plot that resulted array in a 3D surface, where I can see all the 22797 points spread in 3D space? This data is for future Kmeans clustering, so I need to visualise it.

So far I've tried:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#building the 22797x3 array: 


#loading the first array from .txt file, 22797x400 long.
array = np.loadtxt('C:\Users\Scripts/final_array.txt', usecols=range(400))  
array = np.float32(array)

#loading the second array from .txt file, 400x3 long. 
small_vh2 = np.loadtxt('C:\Users\Scripts/small_vh2.txt', usecols=range(3))  
small_vh2 = np.float32(small_vh2)

#multiplying and getting result array 22797x3 long:

Y = np.array(np.matmul(array,small_vh2))
#I've checked Y dimensions, it's 22797x3 long, working fine.

#now I must plot it in 3D:
fig = plt.figure()

ax = Axes3D(fig)
ax.scatter(Y[:, 0], Y[:, 1], Y[:, 2])

plt.show() 

I keep getting the result shown in the image below:

https://i.sstatic.net/jRyHM.jpg

What I need is to get is the 22797 points, and I keep getting only 4 points plotted. Does anybody know what is wrong with the code?


Solution

  • from mpl_toolkits.mplot3d import Axes3D
    import numpy as np
    from matplotlib import pyplot as plt
    
    # made 2 random arrays of the same size as yours
    array = np.random.rand(22797, 400)
    small_vh2 = np.random.rand(400,3)  
    Y = np.matmul(array,small_vh2)
    
    #now I must plot it in 3D:
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    
    ax.scatter(Y[:, 0], Y[:, 1], Y[:, 2], alpha = 0.1)
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    
    plt.show()
    

    enter image description here