如何在折线图上显示“不是数字”?

机器算法验证 数据可视化 缺失数据 不均匀间隔时间序列
2022-04-12 19:31:04

我有一个线图,有时 Y 轴上会出现 NaN。如果我将它们设为零,那么人们会将其与实际零混淆。如果我从数据集中删除它们,可视化效果看起来很糟糕,因为没有足够的数据(在给定时间可能只有 3-4 个数据点)。

如何有效地显示其中包含 NaN 的线图?

2个回答

Stephen Few 有一篇文章Displaying Missing Values and Incomplete Periods in Time Series,其中讨论了一些可能性,例如对缺失的 Y 值使用跳过、虚线或褪色的连接。

在此处输入图像描述

当 X 值定期(上图)时,这些效果很好,但当 X 值不规则(下图)时效果不佳。区别在于是否可以推断出缺失值的位置。

在此处输入图像描述

对于不规则间隔的 X 值,更适合使用某种边缘图来显示缺失的位置,这可能是点(下图)或地毯图。

在此处输入图像描述

有人认为,“坏”的可视化是一种欺骗或扭曲的可视化。线图中一种微妙的欺骗形式是将连续点与线段(或高阶样条)连接起来,因为这呈现了一种引人注目但错误的视觉表示,即(a)存在中间值(不在数据集中)和(b)缺失的点落在这些部分上。

当您的目的是显示数据时,需要注意不要在具有 NaN 值的点之间进行视觉插值。同时——再次避免产生错误印象——您需要一些视觉上明显的机制来显示缺失值的 x 坐标,而无需实际绘制任何点。

这些设计约束建议用地毯图装饰默认线图。R中,使用数组中的数据xy,它看起来像这样:

plot(x, y, type="l", lwd=2, main="Default R Plots")
rug(x)

图 1:默认

图表中的空白清楚地显示了缺失值的位置,底部“地毯”上的刻度准确地指示了缺失的位置(以及缺失了多少值)。不幸的是,这种机制无法显示孤立点!

通过擦除不必要的墨水,创造性地使用线宽和颜色,并张贴缺失的点,我们可以澄清这个情节:

图 2:微妙的情节

地毯已放置在绘图区域之外以使其更清晰,并且缺失 y 值的刻度比其他的更长更清晰。

如果这太微妙,或者如果目标是引起对缺失值的注意,您可以延长地毯图以覆盖绘图区域,甚至绘制所有数据点:

图 3:突出的情节

对于那些想要实现和改进这一点的人,这里是R生成两种类型图的代码。

for(prominent in c(FALSE, TRUE)) {
  plot(x,y, type="n", bty="n", tck=0.025, main=ifelse(prominent, "Prominent", "Subtle"))
  abline(h=0, col="Gray")
  if(prominent) abline(v=x[is.na(y)], col="#d0202040")
  lines(x, y, lwd=2)
  if(prominent) {
    points(x, y, pch=21, bg="#d02020")
  } else {
    i <- !is.na(y)
    i <- !(c(FALSE,i[-length(i)]) | c(i[-1],FALSE))
    points(x[i], y[i], pch=21, bg="#d02020", cex=0.75)
  }
  rug(x, -0.04, col="Gray")
  rug(x[is.na(y)], -0.065, lwd=2, col="#d02020")
}