Как извлечь точки из графика? - PullRequest
6 голосов
/ 24 марта 2012

У меня есть вопрос.

Я построил график с использованием Matplotlib следующим образом:

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

Теперь я хочу запросить значение высоты, используя значение ширины в качестве аргумента.Я не могу найти, как это сделать.Пожалуйста помоги!Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 24 марта 2012

plot() возвращает полезный объект: [<matplotlib.lines.Line2D object at 0x38c9910>]
Отсюда можно получить значения по осям X и Y:

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

Тогда мы можем получить индекс одного из значений ширины:

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]),)

и соответствующая высота:

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

Для проверки мы можем использовать get_xydata():

>>> xy = line2d[0].get_xydata()
>>> xy[-2]
array([ 179.39799331,  315.53469   ])
0 голосов
/ 14 марта 2018

Вот еще один вариант, если вы хотите использовать другую сплайн-функцию:

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)

Затем

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

Или оценить в точке:

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

In[]:  height
Out[]: 247.8396196684303

Функция .item() необходима, потому что splev возвращает array()

0 голосов
/ 24 марта 2012

Вы можете привести массив к списку:

>>> heights[list(widths).index(30)]
38.5

для интерполированного результата:

s = xnew[56] 
print s, heights_smooth[list(xnew).index(s)]
33.7123745819, 40.9547542163

Поскольку xnew - упорядоченный список, вы можете использовать Модуль деления пополам , чтобы найти ближайшее значение ширины для запрашиваемой ширины, а затем найти соответствующую высоту аналогичным образом:

....
import bisect
pyplot.plot(xnew,heights_smooth)
#33.1222 is a queried value which does not exist in xnew.
index_of_nearest_width = bisect.bisect_left(xnew, 33.1222) 
width_val = xnew[index_of_closest_width]
print width_val, heights_smooth[list(xnew).index(width_val)]
#prints the nearest width to 33.1222 then the corresponding height.
33.7123745819 40.9547542163
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...