Сглаживание линейной диаграммы с помощью Matplotlib - PullRequest
0 голосов
/ 07 мая 2020

У меня есть pandas фрейм данных, который выглядит так:

import pandas as pd 
import matplotlib.pyplot

data = [{'A': 21, 'B': 23, 'C':19, 'D':26,'E':28,
        'F':26,'G':23,'H':22,'I':24,'J':21}] 

# Creates DataFrame. 
df = pd.DataFrame(data)

plt.figure(figsize=(12,8))

df.iloc[-1].plot(marker='o',markersize=5)

plt.show()

Когда я пытаюсь построить это в Matplotlib, я получаю очень неровную линию.

Есть ли способ сгладить линию, чтобы она выглядела более изогнутой и плавной?

Я пытался использовать интерполяцию scipy, но безуспешно.

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Это должно сработать:

import pandas as pd 
import matplotlib.pyplot as plt
from scipy import make_interp_spline

data = [{'A': 21, 'B': 23, 'C':19, 'D':26,'E':28,
        'F':26,'G':23,'H':22,'I':24,'J':21}] 

# Creates DataFrame. 
df = pd.DataFrame(data)

y = np.array(df.iloc[-1].tolist())
x = np.arange(len(df.iloc[-1]))

xnew = np.linspace(x.min(), x.max(), 300) 
spl = make_interp_spline(x, y, k=3)
ysmooth= spl(xnew)

plt.plot(xnew, ysmooth)

enter image description here

1 голос
/ 07 мая 2020

Это один из вариантов (хотя и не обязательно идеальный ответ):

Вы можете попробовать использовать полиномиальное приближение для данных, однако вам нужны числовые c значения для обеих осей x и y, Я пробовал следующее:

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np

#note i've changed the A,B,C... to 1,2,3...
data = [{1: 21, 2: 23, 3:19, 4:26,5:28,
    6:26,7:23,8:22,9:24,10:21}] 

#Creates DataFrame. 
df = pd.DataFrame(data)

#define your lists
xlist = df.columns.tolist()
ylist = df.values.tolist()
ylist = ylist[0]

#plot data
plt.figure()
poly = np.polyfit(xlist,ylist,5)
poly_y = np.poly1d(poly)(xlist)
plt.plot(xlist,poly_y)
plt.plot(xlist,ylist)
plt.show()

enter image description here

Другим вариантом может быть интерполяция сплайна, параметры s позволят вам настроить плавность кривой, вы можете проверить несколько значений s:

from scipy.interpolate import splrep, splev

plt.figure()
bspl = splrep(xlist,ylist,s=25)
bspl_y = splev(xlist,bspl)
plt.plot(xlist,ylist)
plt.plot(xlist,bspl_y)
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...