Matplotlib 2D rebanada de datos 3D

No he podido encontrar nada sobre esto, tal vez porque no tengo la nomenclatura correcta (es decir, no sé exactamente cómo solicitarla), pero de todos modos, tengo una matriz de numpy en 3D “a”. Me gustaría identificar y trazar la superficie 2D donde a = 0. Para dejar en claro, los datos son flotadores de precisión doble que varían suavemente en el espacio 3D. Es muy probable que la superficie a = 0 “se enrosque entre” los puntos de la matriz y no quede exactamente sobre ninguno de ellos. Así que necesito algo que pueda interpolar para encontrar la superficie a = 0 y trazarla. ¿Matplotlib tiene una rutina preparada para hacer esto?

Para “identificar y trazar la superficie 2D donde a = 0”, solo necesita subcontratar los datos donde a=0 y trazar (como se muestra a continuación) Si está buscando una proyección de los datos en ese plano, entonces eso es un poco más complicado.

 threeD = np.array([(x,y,z) for x in [0,1] for y in [1,2] for z in [5,6]]) twoD = np.array([(y,z) for (x,y,z) in threeD if x==0]) y,z = zip(*twoD) plt.plot(y,z, 'o') plt.xlim(0,3) plt.ylim(0,7) 

introduzca la descripción de la imagen aquí

La operación de división de volumen generalmente se basa en una noción de interpolación y las más típicas son: Vecino más cercano , Lineal y Cúbico . Tenga en cuenta que estos métodos se pueden adaptar a otras dimensiones (consulte, por ejemplo, interpolación bilineal o trilineal ).

En este caso, está diciendo que tiene un volumen desde el cual puede recuperar segmentos en X, Y, Z (o un híbrido, pero no consideremos este caso, ya que es un problema nuevo y solo generaría confusión).

Entonces, considerando, como ejemplo, una porción X = 5 y X = 6, usted quiere saber cómo obtener la X = 5.5. Echa un vistazo al ejemplo:

 def linear_interpolation(p1, p2, x0): """ Function that receives as arguments the coordinates of two points (x,y) and returns the linear interpolation of a y0 in a given x0 position. This is the equivalent to obtaining y0 = y1 + (y2 - y1)*((x0-x1)/(x2-x1)). Look into https://en.wikipedia.org/wiki/Linear_interpolation for more information. Parameters ---------- p1 : tuple (floats) Tuple (x,y) of a first point in a line. p2 : tuple (floats) Tuple (x,y) of a second point in a line. x0 : float X coordinate on which you want to interpolate a y0. Return float (interpolated y0 value) """ return p1[1] + (p2[1] - p1[1]) * ((x0 - p1[0]) / (p2[0] - p1[0])) X, Y, Z = np.meshgrid(range(10), range(10), range(10)) vol = np.sqrt((X-5)**2 + (Y-5)**2 + (Z-5)**2) Slice5dot5 = linear_interpolation((Y[5, :, :], vol[5, :, :]), (Y[6, :, :], vol[6, :, :]), 5.5) f, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey=True) ax1.imshow(vol[5, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max()) ax1.set_title("vol[5, :, :]") ax2.imshow(Slice5dot5, interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max()) ax2.set_title("vol[5.5, :, :]") ax3.imshow(vol[6, :, :], interpolation='nearest', origin='lower', vmin=vol.min(), vmax=vol.max()) ax3.set_title("vol[6, :, :]") plt.show() 

La función parece documentada (es parte de un proyecto antiguo que hice) para ser utilizada con números, pero funcionará igual de bien con muchos cortes 2D (y será mucho más rápida que unir todas las celdas).

El resultado fue este:

Volumen rebanar matplotlib

Notarás que el color se vuelve más pálido de izquierda a derecha. La división en el medio está totalmente interpolada y no existía anteriormente.