2016-10-17 5 views
1

Итак, с помощью приведенного ниже кода я могу построить рисунок с тремя строками, но они угловые. Можно ли сгладить линии?Как сгладить линии в фигуре в python?

import matplotlib.pyplot as plt 
import pandas as pd 

# Dataframe consist of 3 columns 
df['year'] = ['2005, 2005, 2005, 2015, 2015, 2015, 2030, 2030, 2030'] 
df['name'] = ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'] 
df['weight'] = [80, 65, 88, 65, 60, 70, 60, 55, 65] 
fig,ax = plt.subplots() 

# plot figure to see how the weight develops through the years 
for name in ['A','B','C']: 
    ax.plot(df[df.name==name].year,df[df.name==name].weight,label=name) 

ax.set_xlabel("year") 
ax.set_ylabel("weight") 
ax.legend(loc='best') 
+0

@poke Я не думаю, что это тот же самый вопрос. Я прежде всего пытаюсь ответить на другой вопрос. Я просто не знаю, почему это не работает, но я думаю, что это немного отличается, потому что вам нужно работать здесь с 3 столбцами или массивами вместо другого вопроса, у которого есть только 2 массива. – Jolie

+0

Вы должны интерполировать свои данные перед их графикой, много примеров в SO – Boud

ответ

1

Вы должны применить интерполяцию на свои данные, и она не должна быть «линейной». Здесь я применил «кубическую» интерполяцию, используя scipy's interp1d. Также обратите внимание, что для использования кубической интерполяции ваши данные должны иметь не менее 4 баллов. Поэтому я добавил еще один 2031 год и другое значение тоже все веса (я получил новое значение веса путем вычитания 1 из последнего значения веса):

Вот код:

import matplotlib.pyplot as plt 
import pandas as pd 
from scipy.interpolate import interp1d 
import numpy as np 

# df['year'] = ['2005, 2005, 2005, 2015, 2015, 2015, 2030, 2030, 2030'] 
# df['name'] = ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'] 
# df['weight'] = [80, 65, 88, 65, 60, 70, 60, 55, 65] 

df1 = pd.DataFrame() 
df1['Weight_A'] = [80, 65, 60 ,59] 
df1['Weight_B'] = [65, 60, 55 ,54] 
df1['Weight_C'] = [88, 70, 65 ,64] 
df1.index = [2005,2015,2030,2031] 


ax = df1.plot.line() 
ax.set_title('Before interpolation') 
ax.set_xlabel("year") 
ax.set_ylabel("weight") 

f1 = interp1d(df1.index, df1['Weight_A'],kind='cubic') 
f2 = interp1d(df1.index, df1['Weight_B'],kind='cubic') 
f3 = interp1d(df1.index, df1['Weight_C'],kind='cubic') 

df2 = pd.DataFrame() 
new_index = np.arange(2005,2031) 
df2['Weight_A'] = f1(new_index) 
df2['Weight_B'] = f2(new_index) 
df2['Weight_C'] = f3(new_index) 
df2.index = new_index 

ax2 = df2.plot.line() 
ax2.set_title('After interpolation') 
ax2.set_xlabel("year") 
ax2.set_ylabel("weight") 


plt.show() 

И результаты:

Before interpolation After interpolation

+0

woow спасибо вам огромное! Я пытался сгладить линии почти целый день и просто сдался. Наконец, я просто добавляю дополнительную точку между всеми данными, чтобы немного сгладить ее. Ваш код помогает мне, спасибо! – Jolie

+0

@ Jolie без проблем :) – Yugi