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

6

我正在为在matplotlib中制作3D散点图的接口编写代码,并希望从Python脚本中访问数据。对于2D散点图,我知道操作步骤应该是:

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()

通过上述代码,我知道数据将是一个用我的 (x,y) 数据填充的 (N,2) numpy 数组。当我尝试对三维数据执行相同的操作时:

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是由我的三维数据生成的二维投影,但我真的想访问用于生成散点图的三维数据。这可行吗?

1个回答

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.]]

作为后续,是否可以使用._offsets3d来更新/更改绘制的数据? - James Roberts
是的,这是可能的。 - ImportanceOfBeingErnest
难道不可以使用 ax 来访问这些数据吗? - today
我认为可以通过ax.collections[0]._offsets3d来使用ax访问它。 - today

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接