# How to extract points from a graph?

### Question

I have a question.

I have plotted a graph using Matplotlib like this:

``````from matplotlib import pyplot
import numpy
from scipy.interpolate import spline

widths = numpy.array([0, 30, 60, 90, 120, 150, 180])
heights = numpy.array([26, 38.5, 59.5, 82.5, 120.5, 182.5, 319.5])

xnew = numpy.linspace(widths.min(),widths.max(),300)
heights_smooth = spline(widths,heights,xnew)

pyplot.plot(xnew,heights_smooth)
pyplot.show()
``````

Now I want to query a height value using width value as an argument. I cannot seem to find how to do that. Please help! Thanks in advance!

1
6
3/24/2012 10:08:43 AM

`plot()` returns a useful object: `[<matplotlib.lines.Line2D object at 0x38c9910>]`
From that we can get x- and y-axis values:

``````import matplotlib.pyplot as plt, numpy as np
...
line2d = plt.plot(xnew,heights_smooth)
xvalues = line2d[0].get_xdata()
yvalues = line2d[0].get_ydata()
``````

Then we can get the index of one of the width values:

``````idx = np.where(xvalues==xvalues[-2]) # this is 179.3979933110368
# idx is a tuple of array(s) containing index where value was found
# in this case -> (array([298]),)
``````

And the corresponding height:

``````yvalues[idx]
# -> array([ 315.53469])
``````

To check we can use `get_xydata()`:

``````>>> xy = line2d[0].get_xydata()
>>> xy[-2]
array([ 179.39799331,  315.53469   ])
``````
7
3/24/2012 11:08:16 AM

Here's another option if you're willing to use a different spline function:

``````from matplotlib import pyplot
import numpy
from scipy import interpolate

widths = numpy.array([0, 30, 60, 90, 120, 150, 180])
heights = numpy.array([26, 38.5, 59.5, 82.5, 120.5, 182.5, 319.5])

xnew = numpy.linspace(widths.min(),widths.max(),300)
heights_smooth = interpolate.splrep(widths,heights) #Use splrep instead of spline

#Select desired width values
width_vals = [0, 80.5, 38.98743]

#splev returns the value of your spline evaluated at the width values.
heights = interpolate.splev(width_vals, heights_smooth)
``````

Then

``````In[]:  heights
Out[]: array([ 26.        ,  74.1721985 ,  44.47929453])
``````

Or evaluate at a point:

``````w = 167.2
heights = interpolate.splev(w, heights_smooth)
height = heights.item()

In[]:  height
Out[]: 247.8396196684303
``````

The `.item()` function is necessary because `splev` returns an `array()`