【问题标题】:Extracting data from a 3D scatter plot in matplotlib从 matplotlib 中的 3D 散点图中提取数据
【发布时间】:2018-08-07 07:13:33
【问题描述】:

我正在编写一个用于在 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) 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()

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

【问题讨论】:

    标签: python matplotlib


    【解决方案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.]]
    

    【讨论】:

    • 后续是否可以使用._offsets3d from 来更新/更改绘制的数据?
    • 是的,这是可能的。
    • 难道不能改用ax 来访问这些数据吗?
    • 它认为可以通过ax 使用ax.collections[0]._offsets3d 访问它。
    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2015-10-18
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2016-11-20
    相关资源
    最近更新 更多