仍然需要工作,但这是从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彩色贴图,圆形或对接的线帽,半透明,粗体的边缘等( 点击 放大)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)