pandas 如何在python中平滑图形中的线条?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/40085300/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to smooth lines in a figure in python?
提问by Jolie
So with the code below I can plot a figure with 3 lines, but they are angular. Is it possible to smooth the lines?
因此,使用下面的代码,我可以用 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')
回答by Kennet Celeste
You should apply interpolation on your data and it shouldn't be "linear". Here I applied the "cubic" interpolation using scipy's interp1d
. Also, note that for using cubic interpolation your data should have at least 4 points. So I added another year 2031 and another value too all weights (I got the new weight value by subtracting 1 from the last value of weights):
你应该对你的数据应用插值,它不应该是“线性的”。在这里,我使用 scipy 的interp1d
. 另请注意,对于使用三次插值,您的数据应至少有 4 个点。所以我添加了另一个年份 2031 和另一个值,所有的权重(我通过从最后一个权重值中减去 1 得到新的权重值):
Here's the code:
这是代码:
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()
And the results:
结果: