创建时间范围时序螺旋图

创建时间范围时序螺旋图,第1张

创建时间范围时序螺旋

仍然需要工作,但这是从python和matplotlib开始的。

这个想法是在极坐标中绘制一个螺旋时间轴,周期为1周,每个事件都是该螺旋的弧线,其颜色取决于

dist
数据。

尽管有很多重叠的时间间隔,但这种可视化效果往往会隐藏起来……如果精心选择颜色表,半透明的弧可能会更好。

import numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltimport matplotlib.patheffects as mpeimport pandas as pd# stylingLINEWIDTH=4EDGEWIDTH=1CAPSTYLE="projecting"COLORMAP="viridis_r"ALPHA=1FIRSTDAY=6 # 0=Mon, 6=Sun# load dataset and parse timestampsdf = pd.read_csv('trips.csv')df[['trip_start', 'trip_stop']] = df[['trip_start', 'trip_stop']].apply(pd.to_datetime)# set origin at the first FIRSTDAY before the first trip, midnightfirst_trip = df['trip_start'].min()origin = (first_trip - pd.to_timedelta(first_trip.weekday() - FIRSTDAY, unit='d')).replace(hour=0, minute=0, second=0)weekdays = pd.date_range(origin, origin + np.timedelta64(1, 'W')).strftime("%a").tolist()# # convert trip timestamps to week fractionsdf['start'] = (df['trip_start'] - origin) / np.timedelta64(1, 'W')df['stop']  = (df['trip_stop']  - origin) / np.timedelta64(1, 'W')# sort dataset so shortest trips are plotted last# should prevent longer events to cover shorter ones, still suboptimaldf = df.sort_values('dist', ascending=False).reset_index()fig = plt.figure(figsize=(8, 6))ax = fig.gca(projection="polar")for idx, event in df.iterrows():    # sample normalized distance from colormap    ndist = event['dist'] / df['dist'].max()    color = plt.cm.get_cmap(COLORMAP)(ndist)    tstart, tstop = event.loc[['start', 'stop']]    # timestamps are in week fractions, 2pi is one week    nsamples = int(1000. * (tstop - tstart))    t = np.linspace(tstart, tstop, nsamples)    theta = 2 * np.pi * t    arc, = ax.plot(theta, t, lw=LINEWIDTH, color=color, solid_capstyle=CAPSTYLE, alpha=ALPHA)    if EDGEWIDTH > 0:        arc.set_path_effects([mpe.Stroke(linewidth=LINEWIDTH+EDGEWIDTH, foreground='black'), mpe.Normal()])# grid and labelsax.set_rticks([])ax.set_theta_zero_location("N")ax.set_theta_direction(-1)ax.set_xticks(np.linspace(0, 2*np.pi, 7, endpoint=False))ax.set_xticklabels(weekdays)ax.tick_params('x', pad=2)ax.grid(True)# setup a custom colorbar, everything's always a bit tricky with mpl colorbarsvmin = df['dist'].min()vmax = df['dist'].max()norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)sm = plt.cm.ScalarMappable(cmap=COLORMAP, norm=norm)sm.set_array([])plt.colorbar(sm, ticks=np.linspace(vmin, vmax, 10), fraction=0.04, aspect=60, pad=0.1, label="distance", ax=ax)plt.savefig("spiral.png", pad_inches=0, bbox_inches="tight")

完整时间表

要看到它是一个永不重叠的螺旋形,并且也适用于较长的事件,您也可以绘制完整的时间线(此处

LINEWIDTH=3.5
用于限制莫尔条纹)。

fullt = np.linspace(df['start'].min(), df['stop'].max(), 10000)theta = 2 * np.pi * fulltax.plot(theta, fullt, lw=LINEWIDTH,        path_effects=[mpe.Stroke(linewidth=LINEWIDTH+LINEBORDER, foreground='black'), mpe.Normal()])

带有随机集的示例…

这是一个随机数据集的图,该数据集

200
主要是短途旅行,偶尔还有1到2周的长途旅行。

N = 200df = pd.Dataframe()df["start"] = np.random.uniform(0, 20, size=N)df["stop"] = df["start"] + np.random.choice([np.random.uniform(0, 0.1), np.random.uniform(1., 2.)], p=[0.98, 0.02], size=N)df["dist"] = np.random.random(size=N)

…和不同的风格

inferno_r
彩色贴图,圆形或对接的线帽,半透明,粗体的边缘等( 点击 放大)





欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5632018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存