2016-03-17 26 views
5

Sto cercando di tracciare contemporaneamente un piano e alcuni punti in 3D con Matplotlib. Non ho errori, solo il punto non apparirà. Posso tracciare in momenti diversi punti e piani ma mai allo stesso tempo. La parte del codice è simile:Matplotlib - Traccia un piano e punti in 3D contemporaneamente

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

point = np.array([1, 2, 3]) 
normal = np.array([1, 1, 2]) 

point2 = np.array([10, 50, 50]) 

# a plane is a*x+b*y+c*z+d=0 
# [a,b,c] is the normal. Thus, we have to calculate 
# d and we're set 
d = -point.dot(normal) 

# create x,y 
xx, yy = np.meshgrid(range(10), range(10)) 

# calculate corresponding z 
z = (-normal[0] * xx - normal[1] * yy - d) * 1. /normal[2] 

# plot the surface 
plt3d = plt.figure().gca(projection='3d') 
plt3d.plot_surface(xx, yy, z, alpha=0.2) 


#and i would like to plot this point : 
ax.scatter(point2[0] , point2[1] , point2[2], color='green') 

plt.show() 
+0

correlati: https://stackoverflow.com/questions/13464304/how-can-i-plot-a-3d-plane-in-matlab/13473027#13473027 –

+0

@AndreyRubshtein come è correlato? La domanda a cui ci si riferisce è 'matlab', si tratta di' matplotlib' – tom

+0

Ehi @tom, ha una spiegazione sulla formula matematica, quella che viene chiamata 'Calcola corrispondente z' nella domanda originale –

risposta

6

Avrete bisogno di dire agli assi che si desidera nuovi appezzamenti a aggiungono alle trame attuali sugli assi piuttosto che sovrascrivere. Per fare questo, è necessario utilizzare axes.hold(True)

# plot the surface 
plt3d = plt.figure().gca(projection='3d') 
plt3d.plot_surface(xx, yy, z, alpha=0.2) 

# Ensure that the next plot doesn't overwrite the first plot 
ax = plt.gca() 
ax.hold(True) 

ax.scatter(points2[0], point2[1], point2[2], color='green') 

enter image description here

UPDATE

Come @tcaswell sottolineato nei commenti, si stanno prendendo in considerazione la sospensione supporto per hold. Di conseguenza, un approccio migliore potrebbe essere quella di utilizzare gli assi direttamente per aggiungere più grafici come in @tom's answer.

+0

grazie mille funziona;) – user3601754

+0

Usi effettivamente 'hold' giorno per giorno? Abbiamo parlato di deprecating e mi piacerebbe parlare con qualcuno che effettivamente lo usa .... – tacaswell

+0

@tcaswell Tendo a farlo, ma penso che sia principalmente dovuto alle abitudini che ho sviluppato usando MATLAB. Detto questo, in realtà mi piace l'approccio alternativo citato da [tom] (http://stackoverflow.com/a/36061408/670206) ma non penso mai di usarlo! – Suever

5

Giusto per aggiungere a @ di suever risposta, non c'è alcun motivo per cui non è possibile creare il Axes e poi tracciare sia la superficie e i punti di dispersione su di esso. Poi non c'è bisogno di usare ax.hold():

# Create the figure 
fig = plt.figure() 

# Add an axes 
ax = fig.add_subplot(111,projection='3d') 

# plot the surface 
ax.plot_surface(xx, yy, z, alpha=0.2) 

# and plot the point 
ax.scatter(point2[0] , point2[1] , point2[2], color='green') 
Problemi correlati