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

371 Views Asked by At

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)
1

There are 1 best solutions below

1
Davide_sd On BEST ANSWER

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.