从 matplotlib 散点图中恢复数据

Recover data from matplotlib scatter plot

从 matplotlib 散点图中,我正在尝试恢复点数据。考虑

from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.linspace(0.0, 1.0, 5)
y = np.linspace(0.0, 1.0, 5)
plt.scatter(x, y)

ax = fig.get_children()[1]
pc = ax.get_children()[2]
for path in pc.get_paths():
    print
    print('path:')
    print(path)
    print
    print('segments:')
    for vert, code in path.iter_segments():
        print(code, vert)

plt.show()

这会产生

path:
Path(array([[ 0.        , -0.5       ],
       [ 0.13260155, -0.5       ],
       [ 0.25978994, -0.44731685],
       [ 0.35355339, -0.35355339],
       [ 0.44731685, -0.25978994],
       [ 0.5       , -0.13260155],
       [ 0.5       ,  0.        ],
       [ 0.5       ,  0.13260155],
       [ 0.44731685,  0.25978994],
       [ 0.35355339,  0.35355339],
       [ 0.25978994,  0.44731685],
       [ 0.13260155,  0.5       ],
       [ 0.        ,  0.5       ],
       [-0.13260155,  0.5       ],
       [-0.25978994,  0.44731685],
       [-0.35355339,  0.35355339],
       [-0.44731685,  0.25978994],
       [-0.5       ,  0.13260155],
       [-0.5       ,  0.        ],
       [-0.5       , -0.13260155],
       [-0.44731685, -0.25978994],
       [-0.35355339, -0.35355339],
       [-0.25978994, -0.44731685],
       [-0.13260155, -0.5       ],
       [ 0.        , -0.5       ],
       [ 0.        , -0.5       ]]), array([ 1,  4,  4,  4,  4,  4,  4,  4,  4,
4,  4,  4,  4,  4,  4,  4,  4,
        4,  4,  4,  4,  4,  4,  4,  4, 79], dtype=uint8))

segments:
(1, array([ 0. , -0.5]))
(4, array([ 0.13260155, -0.5       ,  0.25978994, -0.44731685,  0.35355339,
       -0.35355339]))
(4, array([ 0.44731685, -0.25978994,  0.5       , -0.13260155,  0.5       ,  0.
]))
(4, array([ 0.5       ,  0.13260155,  0.44731685,  0.25978994,  0.35355339,
        0.35355339]))
(4, array([ 0.25978994,  0.44731685,  0.13260155,  0.5       ,  0.        ,
        0.5       ]))
(4, array([-0.13260155,  0.5       , -0.25978994,  0.44731685, -0.35355339,
        0.35355339]))
(4, array([-0.44731685,  0.25978994, -0.5       ,  0.13260155, -0.5       ,  0.
]))
(4, array([-0.5       , -0.13260155, -0.44731685, -0.25978994, -0.35355339,
       -0.35355339]))
(4, array([-0.25978994, -0.44731685, -0.13260155, -0.5       ,  0.        ,
       -0.5       ]))
(79, array([ 0. , -0.5]))
/usr/local/lib/python2.7/dist-packages/matplotlib/collections.py:590:
FutureWarning: elementwise comparison failed; returning scalar instead, but in
the future will perform elementwise comparison
  if self._edgecolors == str('face'):

但我没有看到任何与实际分散输入数据相关的数据。也许这不是我需要查看的 ax.get_children()[2] 路径集合?

鉴于 plt.scatter 返回的 PathCollection,您可以调用它的 get_offsets 方法:

from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.linspace(0.0, 1.0, 5)
y = np.linspace(0.0, 1.0, 5)
s = plt.scatter(x, y)

print(s.get_offsets())
# [[ 0.    0.  ]
#  [ 0.25  0.25]
#  [ 0.5   0.5 ]
#  [ 0.75  0.75]
#  [ 1.    1.  ]]

或者,给定 axes 对象 ax,您可以通过 ax.collections 访问 PathCollection,然后调用 get_offsets:

In [110]: ax = fig.get_axes()[0]
In [129]: ax.collections[0].get_offsets()
Out[131]: 
array([[ 0.  ,  0.  ],
       [ 0.25,  0.25],
       [ 0.5 ,  0.5 ],
       [ 0.75,  0.75],
       [ 1.  ,  1.  ]])

你也可以获得z坐标。如果您使用 3d 数据:

from matplotlib import pyplot as plt
import numpy as np
fig = plt.figure()
x = np.linspace(0.0, 1.0, 5)
y = np.linspace(0.0, 1.0, 5)
z = np.linspace(0.0, 10, 5)
s = plt.scatter(x, y, c=z)
cbar=plt.colorbar(s)

要检索 x,y,z 的信息:

ax=fig.get_axes()[0]
x_r=ax.collections[0].get_offsets()[:,0]
y_r=ax.collections[0].get_offsets()[:,1]
z_r=ax.collections[0].get_array()