Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recover data from matplotlib scatter plot [duplicate]

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?

like image 555
Nico Schlömer Avatar asked Feb 09 '23 17:02

Nico Schlömer


1 Answers

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.  ]])
like image 177
unutbu Avatar answered Feb 11 '23 11:02

unutbu