Extracción de datos de un diagtwig de dispersión 3D en matplotlib

Estoy escribiendo una interfaz para hacer diagtwigs de dispersión 3D en matplotlib, y me gustaría acceder a los datos desde un script de python. Para un diagtwig de dispersión 2D, sé que el proceso sería:

import numpy as np from matplotlib import pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) h = ax.scatter(x,y,c=c,s=15,vmin=0,vmax=1,cmap='hot') data = h.get_offsets() 

Con el código anterior, sé que los datos serían una matriz numpy (N,2) rellenada con mis datos (x,y) . Cuando bash realizar la misma operación para datos 3D:

 import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) h = ax.scatter(x,y,z,c=c,s=15,cmap='hot',vmin=0,vmax=1) data = h.get_offsets() 

La variable de data resultante sigue siendo una matriz numpy (N,2) lugar de una matriz numpy (N,3) . El contenido de los data ya no coincide con ninguno de mis datos de entrada; Supongo que los data se rellenan con las proyecciones 2D de mis datos 3D, pero realmente me gustaría acceder a los datos 3D utilizados para generar el diagtwig de dispersión. es posible?

De hecho, las coordenadas obtenidas a través de get_offsets son las coordenadas proyectadas. Las coordenadas originales están ocultas dentro de mpl_toolkits.mplot3d.art3d.Path3DCollection que devuelve la scatter en ejes tridimensionales. Obtendría las coordenadas originales del atributo ._offsets3d . (Este es un atributo “privado”, pero desafortunadamente es la única forma de recuperar esta información).

 import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) x = [1,2,3,4] y = [1,3,3,5] z = [10,20,30,40] c= [1,2,3,1] scatter = ax.scatter(x,y,z,c=c,s=15,cmap='hot',vmin=0,vmax=1) data = np.array(scatter._offsets3d).T print(scatter) # prints mpl_toolkits.mplot3d.art3d.Path3DCollection print(data) # prints # # [[ 1. 1. 10.] # [ 2. 3. 20.] # [ 3. 3. 30.] # [ 4. 5. 40.]]