我有一个线图,有时 Y 轴上会出现 NaN。如果我将它们设为零,那么人们会将其与实际零混淆。如果我从数据集中删除它们,可视化效果看起来很糟糕,因为没有足够的数据(在给定时间可能只有 3-4 个数据点)。
如何有效地显示其中包含 NaN 的线图?
我有一个线图,有时 Y 轴上会出现 NaN。如果我将它们设为零,那么人们会将其与实际零混淆。如果我从数据集中删除它们,可视化效果看起来很糟糕,因为没有足够的数据(在给定时间可能只有 3-4 个数据点)。
如何有效地显示其中包含 NaN 的线图?
Stephen Few 有一篇文章Displaying Missing Values and Incomplete Periods in Time Series,其中讨论了一些可能性,例如对缺失的 Y 值使用跳过、虚线或褪色的连接。
当 X 值定期(上图)时,这些效果很好,但当 X 值不规则(下图)时效果不佳。区别在于是否可以推断出缺失值的位置。
对于不规则间隔的 X 值,更适合使用某种边缘图来显示缺失的位置,这可能是点(下图)或地毯图。
有人认为,“坏”的可视化是一种欺骗或扭曲的可视化。线图中一种微妙的欺骗形式是将连续点与线段(或高阶样条)连接起来,因为这呈现了一种引人注目但错误的视觉表示,即(a)存在中间值(不在数据集中)和(b)缺失的点落在这些部分上。
当您的目的是显示数据时,需要注意不要在具有 NaN 值的点之间进行视觉插值。同时——再次避免产生错误印象——您需要一些视觉上明显的机制来显示缺失值的 x 坐标,而无需实际绘制任何点。
这些设计约束建议用地毯图装饰默认线图。 在R中,使用数组中的数据x和y,它看起来像这样:
plot(x, y, type="l", lwd=2, main="Default R Plots")
rug(x)
图表中的空白清楚地显示了缺失值的位置,底部“地毯”上的刻度准确地指示了缺失的位置(以及缺失了多少值)。不幸的是,这种机制无法显示孤立点!
通过擦除不必要的墨水,创造性地使用线宽和颜色,并张贴缺失的点,我们可以澄清这个情节:
地毯已放置在绘图区域之外以使其更清晰,并且缺失 y 值的刻度比其他的更长更清晰。
如果这太微妙,或者如果目标是引起对缺失值的注意,您可以延长地毯图以覆盖绘图区域,甚至绘制所有数据点:
对于那些想要实现和改进这一点的人,这里是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")
}