简体   繁体   中英

Recover data from matplotlib scatter plot

From a matplotlib scatter plot, I'm trying the recover the point data. Consider

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

This yields

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'):

but I don't see any of that data correlate with the actual scatter input data. Perhaps it's not the ax.get_children()[2] path collection I need to look at?

Given the PathCollection returned by plt.scatter , you could call its get_offsets method:

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

Or, given the axes object, ax , you could access the PathCollection via ax.collections , and then call 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.  ]])

You could also get the z coordinate. In case you used 3d data:

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)

To retrieve information of 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()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM