2016-10-17 2 views
1

그래서 아래 코드를 사용하면 3 줄의 그림을 그릴 수 있지만 각도가 있습니다. 라인을 부드럽게 할 수 있습니까?파이썬에서 그림의 선을 부드럽게 만드는 방법은 무엇입니까?

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. 나는 전에 다른 질문의 대답을 시도한다. 왜 그것이 작동하지 않는지 모르겠지만, 2 열만있는 다른 질문 대신 3 열 또는 배열로 여기서 일해야하기 때문에 조금 다르다고 생각합니다. – Jolie

+0

음모를 꾸미기 전에 데이터를 삽입해야하므로 SO – Boud

답변

1

데이터에 보간을 적용해야하며 "선형"이 아니어야합니다. 여기서 scipy의 interp1d을 사용하여 "3 차"보간법을 적용했습니다. 또한 큐빅 보간법을 사용하려면 데이터에 적어도 4 포인트가 있어야합니다. 그래서 또 다른 해 2031와 다른 값이 너무 모든 무게 (I 무게의 마지막 값에서 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

에 많은 예제가 있습니다. 감사합니다. 나는 거의 하루 종일 줄을 부드럽게하려고 애를 썼다. 마지막으로 모든 데이터 사이에 여분의 점을 넣어 조금 부드럽게 만듭니다. 귀하의 코드는 제게 많은 도움이됩니다, 감사합니다 !! – Jolie

+0

@ 졸리 문제 없어 :) – Yugi

관련 문제