2014-06-09 7 views
5

Ich versuche, ein Streudiagramm mit einigen Datenpunkten (x, y, z, Radius) zu machen, und das ist mein Ergebnis bisher:Scatter Plot 3D mit Etikett und Kugeln

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

x = np.random.rand(20) 
y = np.random.rand(20) 
z = np.random.rand(20) 
r = np.random.rand(20) 


plt.rc('text', usetex=True) 
plt.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"] 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

ax.scatter(x, y, z, s=np.pi*r**2*100, c='blue', alpha=0.75) 

ax.set_xlabel(r'$x$ $\left[\frac{\text{Mpc}}{h}\right]$') 
ax.set_ylabel(r'$y$ $\left[\frac{\text{Mpc}}{h}\right]$') 
ax.set_zlabel(r'$z$ $\left[\frac{\text{Mpc}}{h}\right]$') 

#plt.savefig('spheres.png') 

plt.show() 

http://www.file-upload.net/download-9033814/spheres.png.html

Wie kann ich dieses Diagramm verbessern, um keine Überlappung der x- und y-Label mit den Tics zu haben?

Und es gibt eine Möglichkeit, Kugeln anstelle von Bereichen in diesem 3D-Plot zu machen?

Antwort

8

Sie können ein Diagramm erstellen, das Kugeln anstelle von Kreismarkierungen verwendet, indem Sie an jeder Position eine zeichnen, wie beschrieben here. Hier ein Beispiel:

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

def drawSphere(xCenter, yCenter, zCenter, r): 
    #draw sphere 
    u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j] 
    x=np.cos(u)*np.sin(v) 
    y=np.sin(u)*np.sin(v) 
    z=np.cos(v) 
    # shift and scale sphere 
    x = r*x + xCenter 
    y = r*y + yCenter 
    z = r*z + zCenter 
    return (x,y,z) 


x = 10*np.random.rand(20) 
y = 10*np.random.rand(20) 
z = 10*np.random.rand(20) 
r = np.random.rand(20) 


fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

# draw a sphere for each data point 
for (xi,yi,zi,ri) in zip(x,y,z,r): 
    (xs,ys,zs) = drawSphere(xi,yi,zi,ri) 
    ax.plot_wireframe(xs, ys, zs, color="r") 


plt.show() 

spheres in 3D plot

das Label Positionierung Problem versuchen zu beheben eine zweite Linie, wie here Zugabe.

+0

das Label-Problem kann ich irgendwie nicht lösen, weil ich Latex-Font verwende ... aber danke für die Drahtgitter-Idee! – Andy