InterpolatedUnivariateSpline и ax.fill_between дают неожиданный результат (заполнение неправильной области) с низкими значениями Y - PullRequest
0 голосов
/ 21 мая 2018

У меня есть функция, которая должна принимать некоторые необработанные данные, наносить их на холст и затем заполнять область между базовой линией и заранее заданным пиком, которая хорошо работает для высоких значений Y, но дает обратный результат, когдаиспользуя низкие значения Y.Тогда мой вопрос состоит из двух частей:

  1. Почему это происходит?
  2. Какой надежный способ решить эту проблему (я попытался умножить все значения Y на 1E6 и, выполнивподгонка InterpolatedUnivariateSpline с последующим делением возвращаемой посадки на 1E6, но должен быть лучший способ исправить это.

Фрагмент:

X = [16.08278,16.090878,16.098978,16.107077,16.115177,16.123279,16.13138,16.139482,16.147586,16.155689,16.163793,16.171899,16.180004,16.18811,16.196218,16.204325,16.212433,16.220543,16.228652,16.236762,16.244874,16.252985,16.261097,16.269211,16.277324,16.285439,16.293554,16.30167,16.309786,16.317904,16.326021,16.334139,16.342259,16.350379,16.358499,16.366621,16.374742]
Y = [1.496555,1.766111,2.074339,2.426317,2.825952,3.274024,3.764088,4.288722,4.839724,5.406741,5.978055,6.536869,7.064041,7.540824,7.948076,8.267242,8.48543,8.596198,8.598762,8.492928,8.279867,7.962899,7.55062,7.059239,6.508092,5.91964,5.318298,4.7234,4.148229,3.602356,3.094568,2.635609,2.231337,1.882143,1.58295,1.328678,1.113859]
Y2 = [1496555,1766111,2074339,2426317,2825952,3274024,3764088,4288722,4839724,5406741,5978055,6536869,7064041,7540824,7948076,8267242,8485430,8596198,8598762,8492928,8279867,7962899,7550620,7059239,6508092,5919640,5318298,4723400,4148229,3602356,3094568,2635609,2231337,1882143,1582950,1328678,1113859]

# Toggle low vs high Y-values
#Y = Y2

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111)
plt.plot(X, Y, 'b-')
plt.legend(['Raw Data'], loc='best')
plt.xlabel("Retention Time [m]")
plt.ylabel("Intensity [au]")
newTime = np.linspace(X[0], X[-1], len(X))
f = InterpolatedUnivariateSpline(X, Y)
newIntensity = f(newTime)
ax.fill_between(X, newTime, newIntensity, alpha=0.5)
plt.show(fig)

Это дает следующие цифры:

enter image description here Это то, что я ожидал (и происходит с высокими значениями Y).

enter image description here Это происходит с низкимY-значения.

1 Ответ

0 голосов
/ 21 мая 2018

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

* ax.fill_betweenожидает x, y1 и y2, и с высокими данными Y-значения он начинал заполненную область не с 0, а с X-значения.Это не было очевидно из-за разницы в масштабе, а стало очевидным только после переключения на низкие значения Y.Простое изменение ax.fill_between(X, newTime, newIntensity, alpha=0.5) на ax.fill_between(X, 0, newIntensity, alpha=0.5) дает ожидаемый результат.

...