Physicist
Physicist

Reputation: 3048

How to set set the marker size of a 3D scatter plot fixed to the axis?

I've asked a similar question before (How to set a fixed/static size of circle marker on a scatter plot?), but now I wanna do it in 3D. How can I do that?

thanks

Upvotes: 1

Views: 2167

Answers (1)

hitzg
hitzg

Reputation: 12711

As in the 2D case, you need to draw the spheres yourself. If you want nicely shaped spheres this means to draw many patches and thus gets slow quite quickly.

Here's a basic way of doing it:

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

def plot_shere(ax, x, y, z, r, resolution=100, **kwargs):
    """ simple function to plot a sphere to a 3d axes """

    u = np.linspace(0, 2 * np.pi, resolution)
    v = np.linspace(0, np.pi, resolution)

    xx = r * np.outer(np.cos(u), np.sin(v)) + x
    yy = r * np.outer(np.sin(u), np.sin(v)) + y
    zz = r * np.outer(np.ones(np.size(u)), np.cos(v)) + z

    ax.plot_surface(xx, yy, zz,  rstride=4, cstride=4, **kwargs)

# create some random data (set seed to make it reproducable)
np.random.seed(0)
(x,y,z) = np.random.randint(0,10,(3,5))
r = np.random.randint(2,4,(5,))

# set up the figure
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# loop through the data and plot the spheres
for p in zip(x,y,z,r):
    plot_shere(ax, *p, edgecolor='none', color=np.random.rand(3))

# set the axes limits and show the plot
ax.set_ylim([-4,14])
ax.set_xlim([-4,14])
ax.set_zlim([-4,14])
plt.show()

Result:

enter image description here

Upvotes: 3

Related Questions