2013-03-05 8 views

Odpowiedz

16

Aby połączyć różne rodzaje działek w tym samym wykresie należy użyć funkcji

plt.hold (prawda).

Poniższy kod działki 3D wykres punktowy z 3D działki powierzchni:

from mpl_toolkits.mplot3d import * 
import matplotlib.pyplot as plt 
import numpy as np 
from random import random, seed 
from matplotlib import cm 


fig = plt.figure() 
ax = fig.gca(projection='3d')    # to work in 3d 
plt.hold(True) 

x_surf=np.arange(0, 1, 0.01)    # generate a mesh 
y_surf=np.arange(0, 1, 0.01) 
x_surf, y_surf = np.meshgrid(x_surf, y_surf) 
z_surf = np.sqrt(x_surf+y_surf)    # ex. function, which depends on x and y 
ax.plot_surface(x_surf, y_surf, z_surf, cmap=cm.hot); # plot a 3d surface plot 

n = 100 
seed(0)          # seed let us to have a reproducible set of random numbers 
x=[random() for i in range(n)]    # generate n random points 
y=[random() for i in range(n)] 
z=[random() for i in range(n)] 
ax.scatter(x, y, z);      # plot a 3d scatter plot 

ax.set_xlabel('x label') 
ax.set_ylabel('y label') 
ax.set_zlabel('z label') 

plt.show() 

wynik:

http://s9.postimage.org/ge0wb8kof/3d_scatter_surface_plt.gif

można zobaczyć kilka innych przykładów z 3D działek tutaj:
http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html

Zmieniłem kolory powierzchni z powrotem m domyślne do colormap „na gorąco” w celu odróżnienia kolory dwóch działek - teraz, to widać, że powierzchnia działki zastępuje wykres punktowy, niezależnie od kolejności ...

EDIT: Aby rozwiązać ten problem, należy zastosować przezroczystość w mapie kolorów na powierzchni; dodanie kodu w: Transparent colormap i zmieniając linię:

ax.plot_surface(x_surf, y_surf, z_surf, cmap=cm.hot); # plot a 3d surface plot 

do

ax.plot_surface(x_surf, y_surf, z_surf, cmap=theCM); 

otrzymujemy:

http://s16.postimage.org/5qiqn0p5h/3d_scatter_surface_plt_transparent.gif

+1

Do tego celu należy (ręcznie) podzielić dane na wykresie punktowym na pół (dane powyżej płaszczyzny i danych poniżej), a następnie narysować trzy rzeczy we właściwej kolejności. zobacz http://stackoverflow.com/questions/14824893/how-to-draw-diagrams-like-this/14825951#14825951 – tacaswell

+0

Jeśli potrzebujesz "prawdziwego" renderingu 3D, popatrz na mayavi z entuzjazmu. http://code.enthought.com/projects/mayavi/ – tacaswell

+1

@tcaswell Zauważyłem, że nawet zmieniając kolejność działek, powierzchnia pojawia się zawsze na wierzchu, i to jest dziwne ... (Zorder również nie działa) Dlatego zdecydowałem się używać folii. –

12

Korzystanie przykład siluaty za; zamiast używać przezroczystości za pomocą polecenia cmap = theCM, możesz dostosować wartość alfa. To może Ci dać to, czego chcesz?

ax.plot_surface(x_surf, y_surf, z_surf, cmap=cm.hot, alpha=0.2) 
+0

Chciałem wiedzieć, czy było coś takiego jak alfa, a twój komentarz uczynił to oczywistym! – user89