从 matplotlib 中的 3D 散点图提取数据

Jam*_*rts 6 python matplotlib

我正在编写一个用于在 matplotlib 中制作 3D 散点图的接口,并且我想从 python 脚本访问数据。对于二维散点图,我知道过程是:

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()
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,我知道 data 将是一个(N,2)填充了我的数据的 numpy 数组(x,y)。当我尝试对 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()
Run Code Online (Sandbox Code Playgroud)

结果data变量仍然是(N,2)numpy 数组而不是(N,3)numpy 数组。的内容data不再与我的任何输入数据匹配;我假设其中data填充了 3D 数据的 2D 投影,但我真的很想访问用于生成散点图的 3D 数据。这可能吗?

Imp*_*est 4

事实上,通过获得的坐标get_offsets是投影坐标。原始坐标隐藏在由三维轴mpl_toolkits.mplot3d.art3d.Path3DCollection返回的内部。scatter您将从属性中获取原始坐标._offsets3d。(这是一个“私有”属性,但不幸的是这是检索此信息的唯一方法。)

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.]]
Run Code Online (Sandbox Code Playgroud)