Как интерполировать точки в сиборне

#python #matplotlib #scipy #seaborn #data-visualization

Вопрос:

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

Итак, мой вопрос в том, существует ли какой-то собственный метод создания интерполированных линий с использованием Seaborn? Есть ли способ, аналогичный способу построения line_shape (hv, vh, hvh, сплайн, линейный)?

Ссылка в сюжете на желаемую форму:

(Если нет, то какой инструмент вы бы порекомендовали для достижения того же эффекта?) Спасибо!

Ответ №1:

Чтобы выбрать интерполятор в сиборне, вы полагаетесь на Matplotlib. Как отмечалось в https://seaborn.pydata.org/generated/seaborn.lineplot.html

ключ kwargs, сопоставления значений и другие аргументы ключевых слов передаются в matplotlib.axes.Axes.plot().

Таким образом, вы можете передать drawstyle аргумент, который позволяет вам выбирать между линейным или несколькими различными стилями шага. Смотрите второй пример на https://matplotlib.org/stable/gallery/lines_bars_and_markers/step_demo.html

 import seaborn as sns
import matplotlib.pyplot as plt


x = [1, 2, 3, 4, 5]
y = [1, 3, 2, 3, 1]


dss=['default','steps-pre','steps-mid','steps-post']
fig = plt.figure()
for i,ds in enumerate(dss):
    ax = fig.add_subplot(len(dss),1,1 i)
    sns.lineplot(x=x,y=y,ax=ax,drawstyle=ds,markers='o')
    ax.scatter(x,y)

plt.show()
 

результат из приведенного выше кода

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

Комментарии:

1. Отличный ответ! Очень простой и не нуждается в других модулях. Я не знал этого параметра, и теперь я знаю, как прочитать это последнее примечание «ключ kwargs» в документации. Большое спасибо!

Ответ №2:

Для интерполяции вы можете использовать scipy.interpolate.interp1d , который поддерживает множество различных методов:

‘линейный’, ‘ближайший’, ‘ближайший вверх», ‘нулевой’, ‘линейный’, ‘квадратичный’, ‘кубический’, ‘предыдущий’ или ‘следующий’

Чтобы воспроизвести предоставленный вами сюжет, вот пример кода:

 import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
import seaborn as sns


x = [1, 2, 3, 4, 5]
y = [1, 3, 2, 3, 1]
x_interp = np.linspace(x[0], x[-1], 1000)

methods = ['linear', 'nearest', 'nearest-up', 'zero', 'slinear', 'quadratic', 'cubic', 'previous', 'next']


fig, ax = plt.subplots()

for i, method in enumerate(methods, 0):
    y_values = [y_i   5*i for y_i in y]
    y_interp = interp1d(x, y_values, kind = method)(x_interp)
    sns.lineplot(x_interp, y_interp, label = method, ax = ax)
    sns.scatterplot(x, y_values, ax = ax)

ax.legend(frameon = False, loc = 'upper left', bbox_to_anchor = (1.05, 1))
plt.tight_layout()

plt.show()
 

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

Комментарии:

1. Отличный ответ и чрезвычайно полные знания! Большое спасибо! В этом решении нам нужно действительно интерполировать точки. Немного сложнее, но очень важно лучше понять процесс. Также можно получить интерполированные значения между точками. Так что это не просто вариант рендеринга, он более доступен для проверки.