我想在我的论文中包括一个图(文档将是标准的a4页面pdf),我有两个时间序列的数据,两者都是以百分比表示的连续值。
这两个时间序列都超过了一年,没有周日,因此每个时间序列大约有310个数据点。
我试着带着这样的东西,
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ts = day_agg_plan_temp.set_index('Date')
ts = ts['2018-01-01': '2019-01-01']
plt.figure(figsize=(20,15))
ax1 = ts.label.plot(grid=True, label='Ground Truth', marker='.')
ax2 = ts.pred.plot(grid=True, label='Prediction', marker='.')
plt.legend()
plt.show()结果是:

这并不是很吸引人,因为发生了太多的事情,我想指出蓝色和橙色线上每个数据点的差异。
所以我的问题是,有没有比缩小日期范围更好的方法(这是我真的不想要的,因为这个图已经是覆盖近3年的实际时间序列的一个片段)
发布于 2019-07-30 21:19:12
下面是一些代码,这些代码使用Fractional Brownian motion生成数据,使用Savitzky–Golay filter计算趋势(但使用最适合您的案例研究的方法),并以用户可以同时清楚地看到原始数据和趋势的方式绘制它。
from scipy.stats import norm
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter
# Generating some Random Data
def brownian(x0, n, dt, delta, out=None):
x0 = np.asarray(x0)
r = norm.rvs(size=x0.shape + (n,), scale=delta * sqrt(dt))
if out is None:
out = np.empty(r.shape)
np.cumsum(r, axis=-1, out=out)
out += np.expand_dims(x0, axis=-1)
return out
delta = 2
T = 10.0
N = 500
dt = T/N
m = 2
x = np.empty((m,N+1))
x[:, 0] = 50
brownian(x[:,0], N, dt, delta, out=x[:,1:])
t = np.linspace(0.0, N*dt, N+1)
# Obtaining the trend using some arbitrary filter
y1 = savgol_filter(x[0], 51, 3)
y2 = savgol_filter(x[1], 51, 3)
# Plotting the raw data (transparent)
plt.plot(t, x[0], color="red", alpha=0.2)
plt.plot(t, x[1], color="blue", alpha=0.2)
# Plotting the trend data (opaque)
plt.plot(t, y1, color="red")
plt.plot(t, y2, color="blue")
# Calling the plot
plt.show()结果是这样的:

我的观点是,通过使用颜色(或透明度),您可以使一些数据看起来就像在背景中一样,而其他数据(通常是最相关的)就像出现在前景中一样。这是一种UX技术(如模糊、变暗或使背景变浅)。
如果数据的垂直可变性不足以清楚地分隔集合,也可以使用线条宽度(或样式)。在你的情况下,我认为没有必要这样做。
https://stackoverflow.com/questions/57267720
复制相似问题