Search code examples
python-3.xmatplotlibgeometryaxes

How to get the plot of 3D geometry with equal axes in python using matplotlib?


I am facing a problem to plot the geometry in the python using matplotlib. I would like to have a plot which can have the equal lenth in all three axes (X, Y, Z). I have written below code but it does not show any equal axes in the obtained geometry.

How can I get the plot with equal axes?

def plotting(x, y, z, figname):
    fig = plt.figure(figsize = (50,50))
    ax = plt.axes(projection='3d')
    ax.grid()

    ax.scatter(x, y, z, c = 'r', s = 50)
    ax.set_title(figname)

    ax.set_xlabel('x', labelpad=20)
    ax.set_ylabel('y', labelpad=20)
    ax.set_zlabel('z', labelpad=20)

Solution

  • Matplotlib makes this very difficult. One way you could "achieve" that is by setting the same limits to xlim, ylim, zlim:

    import numpy as np
    import matplotlib.pyplot as plt
    
    n = 1000
    t = np.random.uniform(0, 2*np.pi, n)
    p = np.random.uniform(0, 2*np.pi, n)
    x = (4 + np.cos(t)) * np.cos(p)
    y = (1.5 + np.cos(t)) * np.sin(p)
    z = np.sin(t)
    
    fig = plt.figure()
    ax = fig.add_subplot(projection="3d")
    ax.scatter(x, y, z)
    ax.set_xlim(-4, 4)
    ax.set_ylim(-4, 4)
    ax.set_zlim(-4, 4)
    plt.show()
    

    Otherwise, your best bet is to use a different plotting library for 3D plots. Plotly allows to easily set equal aspect ratio. K3D-Jupyter and Mayavi uses equal aspect ratio by default.