从matplotlib散点图中恢复数据

时间:2015-10-25 23:34:37

标签: python matplotlib scatter

从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]路径集合?

2 个答案:

答案 0 :(得分:5)

鉴于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.  ]])

答案 1 :(得分:0)

你也可以得到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()