跳至主要内容

论文阅读 SineStream

· 阅读时间约 8 分钟

TLDR

本文包含我对论文"SineStream: Improving the Readability of Streamgraphs by Minimizing Sine Illusion Effects"(SineStream:通过最小化正弦错觉效应提高流图可读性)的笔记。我将讨论问题陈述、评估标准、作者的方法以及案例研究。

论文

下载 PDF

.

笔记

流图

定义

流图(Stream graph),有时写作 streamgraph,是围绕"中心轴"的堆叠图,形成流动的有机形状。流图展示了主题是如何演变的。

问题陈述:

给定一个时间序列 f1,f2,...fn{f_1,f_2,...f_n} 和一个基准线 g0g_0,计算 fif_i 的顶层如下:

gi=g0+j=1ifjg_i=g_0+\sum_{j=1}^if_j

关于如何计算 g0g_0 的问题仍然开放。两种简单的策略是:

  • 简单模型:g0  0g_0\ \equiv\ 0
  • 围绕 x 轴对称:g0 = 12i=1nfig_0\ =\ -\frac{1}{2}\sum_{i=1}^nf_i

备注:

fi = fi(t0),fi(t1),...fi(tn)f_i\ =\ {f_i(t_0),f_i(t_1),...f_i(t_n)}

,因此 gi = gi(t0),gi(t1),...gi(tn)g_i\ =\ {g_i(t_0),g_i(t_1),...g_i(t_n)}

如何计算基准线

参考文献:Stacked Graphs - Geometry and Aesthetic, L. Byron, M. Wattenberg

  • 简单模型:g0  0g_0\ \equiv\ 0

  • 解决方案 1:最小化轮廓(与对称模型相同)
    轮廓:f(g0) = g02+gn2 = g02+(g0+i=1nfi)f(g_0)\ =\ g_0^2 + g_n^2\ =\ g_0^2+(g_0+\sum_{i=1}^nf_i)

    dfdg0=0  g0=12i=1nfi\frac{df}{dg_0} = 0\ \Longrightarrow\ g_0=-\frac{1}{2}\sum_{i=1}^nf_i
  • 解决方案 2:最小化 gig_i 与 x 轴的偏差(最小化 wiggle)
    偏差:f(g0)=i=0ngi2f(g_0)=\sum_{i=0}^ng_i^2

    dfdg0=0  g0=1n+1i=1n(ni+1)fi\frac{df}{dg_0} = 0\ \Longrightarrow\ g_0=-\frac{1}{n+1}\sum_{i=1}^n(n-i+1)f_i

正弦错觉效应

(a) 沿着正弦曲线绘制了一条均匀厚度的线。我们的感知导致我们使用正交距离而不是垂直距离来确定其厚度。(b) 流图中带有虚线边框的绿色层看起来具有恒定的厚度。然而,在其垂直厚度中出现了一个峰值 (c)

方法:

由于流图的几何形状由其基准线(最底部的曲线)和层的排序控制。
作者重新解释了基准线计算和层排序算法,以减少正弦错觉效应。
对于基准线计算,通过引入高斯权重来惩罚具有大厚度变化的层,从而改进之前的方法。
对于层排序,提出了三个设计要求,并通过层次聚类算法实现。

基准线计算

评估标准

  • Wiggle 度量
    • Byron 和 Wattenberg:
      Wiggle=i=1n(12(gi+gi1))2wiWiggle=\sum_{i=1}^n(\frac{1}{2}(g_i'+g_{i-1}'))^2*w_i
    • Bartolomeo 和 Hu:
      Wigglen1=i=1ngi+gi12wiWiggle_{n1}=\sum_{i=1}^n\frac{|g_i'|+|g_{i-1}'|}{2}*w_i

然而,尽管它被广泛使用,但使用 wiggle 度量来优化流图布局主要基于经验观察,缺乏明确的感知基础。这就是为什么作者想在这一点上引入正弦错觉的原因。

  • 正弦错觉:
Illustion=Wiggle=i=1n(12(gi+gi1))2wi=i=1n(g0+12fi+j=1i1fj)2wiIllustion = Wiggle = \sum_{i=1}^n(\frac{1}{2}(g_i'+g_{i-1}'))^2*w_i = \sum_{i=1}^n(g_0'+\frac{1}{2}f_i'+\sum_{j=1}^{i-1}f_j')^2*w_i

作者的方法

g0=1i=1nWii=0n12(j=1ifj+j=1i1fj)wi=i=1nwi(f1+j=1i1(fj+fj+1))2i=1nwig_0' = -\frac{1}{\sum_{i=1}^nW_i}\sum_{i=0}^n\frac{1}{2}(\sum_{j=1}^if_j'+\sum_{j=1}^{i-1}f_j')w_i = -\frac{\sum_{i=1}^nw_i(f_1'+\sum_{j=1}^{i-1}(f_j'+f_{j+1}'))}{2\sum_{i=1}^nw_i}

作者修改了原始权重 w i = f i,采用高斯权重来减少当层厚度发生较大变化时该层的影响:

wi=exp(fi22c2)fiw_i=exp(-\frac{f_i'^2}{2c^2})*f_i

其中 c 可以是 f1,f2,...,fn|f_1'|,|f_2'|,...,|f_n'| 的中位数、算术平均值、调和平均值或几何平均值

层排序算法

传统计算

  • Byron 和 Wattenberg:LateOnset

  • Bartolomeo 和 Hu:TopOpt

作者的方法

对比

不同排序算法的比较如图所示。使用 LateOnset,层根据其开始时间添加到流图中。新层(例如,粉色的第 2 层)通常放在倾斜的基准线上,这会对这些新层引入扭曲和正弦错觉效应。TwoOpt 倾向于将厚层(浅绿色的第 6 层)放在中间,导致邻近层出现大扭曲和强烈的正弦错觉效应。与 LateOnset 和 TwoOpt 相比,作者的排序算法(c)产生了视觉上令人愉悦的流图。在大多数层中,正交和垂直方向是对齐的,因此正弦错觉被最小化。

  • 补偿度

作者定义了补偿度 comp(i,j)comp(i,j) 来描述每两层 fi,fjf_i,f_j 的相互补偿:

comp(i,j)=1Lt=0Tfi(t)+fj(t)fi(t)+fj(t)comp(i,j) = \frac{1}{L}\sum_{t=0}^T\frac{|f_i'(t)+f_j'(t)|}{|f_i'(t)|+|f_j'(t)|}

其中 L 表示组合层的长度。作者定义当 fi(t)+fj(t)=0|f_i'(t)|+|f_j'(t)| = 0 时,fi(t)+fj(t)fi(t)+fj(t)=0\frac{|f_i'(t)+f_j'(t)|}{|f_i'(t)|+|f_j'(t)|} = 0

  • 厚度权重

作者引入了厚度权重来描述我们对相对较薄层补偿的偏好:

wth(i,j)=max{fi(t)+fj(t):t[1,m]}w_{th}(i,j) = max\{f_i(t)+f_j(t):t\in[1,m]\}

其中 fi(t)f_i(t) 表示 fif_i 在时间点 tt 的值,mm 表示时间点的数量。

  • 长度权重

作者使用长度权重来描述我们对相对较长层补偿的偏好:

wlen(i,j)=max(mLi,mLj)w_{len}(i,j)=max(\frac{m}{L_i},\frac{m}{L_j})

其中 LiL_i 是层 fif_i 的长度

  • 距离
dist(i,j)=comp(i,j)wlen(i,j)wth(i,j)dist(i,j)=comp(i,j)*w_{len}(i,j)*w_{th}(i,j)

dist(i,j)dist(i, j) 越小,应该给予确保层 fif_i 和层 fjf_j 相邻的优先级越高。

  • 基于层次聚类的排序

在每个时间步骤(蓝色圆圈中的编号),具有最短距离的两层 fif_ifjf_j 合并得到一个新的组合层 fk=fi+fjf_k={f_i+f_j}。然后计算这个新层 fkf_k 与所有其他层之间的距离,并重复合并。

为了保证最小化正弦错觉的排序,作者通过最小化相邻层之间的距离总和来创建最终顺序:

arg mini=1n1dist(i,i+1)arg\ min\sum_{i=1}^{n-1}dist(i,i+1)

其中第 ii 层和第 i+1i+1 层对应于层次聚类树的两个相邻叶节点。

案例

提示

在上面的演示中,SineStream 的代码已被我重新组织。如果您需要查看论文的原始源代码,请访问https://github.com/Ideas-Laboratory/SineStream。如果您有兴趣探索其他成熟的流布局方法,可以访问https://d3js.org/d3-shape/stack