我正在编写一个用于在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()
使用上面的代码,我知道数据将是一个(N,2)
数据填充的(x,y)
numpy数组。当我尝试对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()
生成的data
变量仍然是(N,2)
numpy数组,而不是(N,3)
numpy数组。 data
的内容不再与我的任何输入数据匹配;我假设data
中填充了3D数据的2D投影,但是我真的很想访问用于生成散点图的3D数据。这可能吗?
答案 0 :(得分:1)
实际上,通过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.]]