Как построить линию (многоугольная цепь) с numpy / scipy / matplotlib с минимальным сглаживанием

Я пытаюсь построить линию в matplotlib .. Я ищу подходящий тип интерполяции .. Я хочу что-то вроде этого

взято из canvasxpress.org/line.html

где каждая строка сглажена. Я попробовал несколько комбинаций scipy и matplotlib, таких как

x_new = np.arange(x, x_length, 1) tck = interpolate.splrep(x, y, s=3) y_new = interpolate.splev(x_new, tck, der=0) ax.plot(x_new, y_new, color+lstyle) 

но лучший результат, который я получаю, – это

мой результат

Линия представляет собой увеличивающуюся переменную .. так что это неправильное представление. Что я могу найти?

благодаря

Edit: Я думаю о реализации метода от себя, но я не знаю, было ли это уже сделано. Псевдокод следующий

 take x and y calculate spline for each three points x[0], x[1], x[2] ... x[1], x[2], x[3] ... and so on for each y[n] sums every computation done for it and divide by number of computations (ie y[1] is computed for triplette x[0..2] and x[1..3] so the sum is divided by two (average for each point is taken as its value) 

  • Argmax каждой строки или столбца в scipy разреженной матрице
  • Быстрое (er) причудливое индексирование и сокращение?
  • Кластеризация с scipy-кластерами через матрицу расстояний, как вернуть исходные объекты
  • Как подкласс scipy.stats.norm?
  • Сохранить / загрузить scipy sparse csr_matrix в переносном формате данных
  • Установка только одного параметра функции со многими параметрами в python
  • Есть ли набор тестов для numpy / scipy?
  • Как добавить файл .mat с помощью scipy.io.savemat?
  • 5 Solutions collect form web for “Как построить линию (многоугольная цепь) с numpy / scipy / matplotlib с минимальным сглаживанием”

    Для этого типа графика вы хотите монотонную интерполяцию. Класс PchipInterpolator (который вы можете называть его более коротким псевдонимом pchip ) в scipy.interpolate можно использовать:

     import numpy as np from scipy.interpolate import pchip import matplotlib.pyplot as plt # Data to be interpolated. x = np.arange(10.0) y = np.array([5.0, 10.0, 20.0, 15.0, 13.0, 22.0, 20.0, 15.0, 12.0, 16.0]) # Create the interpolator. interp = pchip(x, y) # Dense x for the smooth curve. xx = np.linspace(0, 9.0, 101) # Plot it all. plt.plot(xx, interp(xx)) plt.plot(x, y, 'bo') plt.ylim(0, 25) plt.grid(True) plt.show() 

    Результат:

    введите описание изображения здесь

    Проблема не является проблемой отображения. Это проблема интерполяции. Вы интерполируете с использованием функций сплайна. Выбор правильного метода интерполяции очень зависит от типа данных, которые у вас есть. Вы не можете рассчитывать на функцию интерполяции, которая будет вести себя правильно при любых обстоятельствах (интерполяция не имеет способа узнать, что ваша функция увеличивается).

    Вы должны смотреть на

    scipy.interpolate.LSQUnivariateSpline и играть с параметром k (степень сплайна)

    или scipy.interpolate.UnivariateSpline и играть с параметрами k и s.

    Важно понимать, что интерполяция – это не просто линия для визуализации. Это математическая модель, представляющая, как вы думаете, что система ведет себя (система, которая генерирует данные, которые вы измеряли). Различные типы интерполяций представляют собой различные предположения о системе.

    Итак, если вы знаете, что ваша система такова, что переменная может только увеличиваться, вы должны соответствовать соответствующей модели (т. Е. Использовать соответствующую интерполяцию). Глядя на ваши данные, он выглядит как полином второй степени или экспоненциальная функция может хорошо подходить. Будет также работать Loess (местная регрессия). Вы можете использовать либо индивидуальные функции, такие как numpy.polyfit (), либо обобщенную кривую с помощью scipy.optimize.curve_fit (). Если у вас есть дополнительные знания о системе, вы должны использовать ее, чтобы выбрать подходящую модель.

    Я немного огляделся. То, что вы хотите, называется

    Монотонная кубическая интерполяция,

    см. здесь . Здесь вы обсуждаете здесь mathexchange, и я нашел реализацию в python здесь . Дайте мне знать, если это сработает!

    Python - лучший язык программирования в мире.