如何平滑 matplotlib 中的折线图?

Nic*_*era 6 python data-visualization matplotlib

我已经尝试了所有方法并在此处查看了其他线程,但我找不到如何平滑 matplotlib 图表中的线条。问题是,在大多数教程中,两个轴都有数值,而在我的例子中,对于我的 x 轴,我有一个日期值......

这可能吗?如果没有,是否有任何其他可视化库可以让我做到这一点?

这是我的代码:

date = ["Jan", "Feb", "Mar", "Apr", "May"]
value = [4,12,15,7,25]
plt.plot(date,value)

plt.show() 
Run Code Online (Sandbox Code Playgroud)

当前正在输出:

在此输入图像描述

我想这样展示:

在此输入图像描述

多谢!

Tom*_*Tom 8

我撤回了我的接近投票,因为我错过了您针对 x 轴上的字符串绘制的问题(因此在它们之间进行插值更加困难)。正如其他人所建议的那样,关键是使用日期字符串来获取用于绘图和插值的数字。一旦你这样做了,这个答案仍然是一个值得遵循的很好的框架。

\n
import matplotlib.pyplot as plt\nimport numpy as np\nfrom scipy.interpolate import make_interp_spline\n\n# original data\ndate = ["Jan", "Feb", "Mar", "Apr", "May"]\nvalue = [4,12,15,7,25]\n\n# create integers from strings\nidx = range(len(date))\nxnew = np.linspace(min(idx), max(idx), 300)\n\n# interpolation\nspl = make_interp_spline(idx, value, k=3)\nsmooth = spl(xnew)\n\n# plotting, and tick replacement\nplt.plot(xnew, smooth)\nplt.xticks(idx, date)\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

idx是值(0, 1, 2, 3, 4),用于绘图和插值。最后,调用xticks用于使用日期字符串来标记这些刻度位置。

\n

以上主要基于评论(来自HenryEckerJohanC)。我想添加的新内容是进行插值的另一种方法是将字符串转换为实际的日期时间:

\n
import matplotlib.dates as mdates # for formatting\nimport matplotlib.pyplot as plt\nfrom scipy.interpolate import make_interp_spline\nimport pandas as pd # for working with dates\n\n# instead of ["Jan", "Feb", "Mar", "Apr", "May"], create datetime objects\ndate = pd.date_range(\'01-01-2020\', freq=\'MS\', periods=5)\n# DatetimeIndex([\'2020-01-01\', \'2020-02-01\', \'2020-03-01\', \'2020-04-01\', \'2020-05-01\'], dtype=\'datetime64[ns]\', freq=\'MS\')\n\nvalue = [4,12,15,7,25]\n\n# now make new x positions using a date range, instead of linspace \n# see here: /sf/answers/3551004831/\nxnew = pd.date_range(date.min(), date.max(), periods=300)\n\n# interpolation\nspl = make_interp_spline(date, value, k=3)\nsmooth = spl(xnew)\n\n# plotting\nplt.plot(xnew, smooth)\n\n# using mdates to get the x-axis formatted correctly\nmonths = mdates.MonthLocator()\nfmt = mdates.DateFormatter(\'%b\') # %b -> Month as locale\xe2\x80\x99s abbreviated name\nax = plt.gca()\nax.xaxis.set_major_locator(months)\nax.xaxis.set_major_formatter(fmt)\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

后一种方法涉及一些额外的格式化工作(和导入),但它对于绘制时态数据更加明确。我发现这使用起来更加直观。例如,如果您有多个时间序列,您可以轻松并排绘制它们;您可以在代码中更轻松地引用特定日期;您不必记住哪些索引指的是哪些日期(例如三月和2本例中)等...

\n