线图的颜色和线宽建议

机器算法验证 r 数据可视化
2022-01-25 22:57:28

关于地图、多边形和阴影区域的色盲友好颜色选择的文章很多(例如,参见http://colorbrewer2.org)。我还没有找到关于线条颜色和不同线条粗细的建议。目标是:

  1. 很容易区分线条,即使它们交织在一起
  2. 线条很容易被最常见的色盲形式的人区分
  3. (不太重要)行是打印机友好的(参见上面的 Color Brewer)

在黑色和灰度线的背景下,我发现使用细黑线和粗灰度线非常有效。我将不胜感激具体的建议,包括不同的颜色、灰度等级和线条粗细。我不喜欢不同的线型(实线/虚线/虚线),但可以谈论这种观点。

最好在一张图表上建议最多 10 条曲线。更好的做法是像 Color Brewer 所做的那样:允许 m 行的建议不是 n > m 的 n 行建议的子集,并将 m 从 1 变为 10。

请注意:我也希望仅解决问题的线条着色部分的指导。

一些从业者每隔几厘米在线条上添加符号,以更好地区分不同的类别。我不太赞成需要多个特征(例如颜色+符号类型)来区分类别,并且有时希望保留符号来表示不同的信息。

在没有其他指导的情况下,我建议在 colorbrewer2.org 中为多边形使用推荐的相同颜色作为线条,并将线条宽度乘以 2.5 以绘制不太明亮/密集颜色的线条。我正在创建一个 R 函数来设置它。除了颜色 brewer 颜色之外,我想我会让前两种颜色为纯黑色(薄)和灰度(厚),尽管有人可能会争辩说它们应该是薄的纯黑色和薄蓝色。

R 函数可以在http://biostat.mc.vanderbilt.edu/wiki/pub/Main/RConfiguration/Rprofile找到。定义函数后colBrew,您可以通过键入来查看设置的工作方式

showcolBrew(number of line types)  # add grayscale=TRUE to use only grayscale

latticeSet还给出了一个函数,用于将lattice图形参数设置为新设置。欢迎对算法进行改进。

探索:Rdichromat包:http ://cran.r-project.org/web/packages/dichromat/

4个回答

我将在这里尝试挑衅,并想知道是否会出现此类指南的缺失,因为这是一个几乎无法解决的问题。不同领域的人们似乎都同意经常谈论“意大利面条情节”以及它们在区分不同系列时所带来的问题。

具体来说,多个单独时间序列的大量线条可以共同传达一般模式,有时也可以传达与任何此类模式不同的单独序列。

然而,我认为这个问题是关于区分所有具有您关心的身份的单个时间序列。

如果你说2或3系列,区分系列通常不会太难,我倾向于用实线在红蓝黑两三个中。我也玩过 Hastie 和朋友使用的橙色和蓝色(参见@user31264 的回答)。

改变线型(实线、虚线、虚线等)我发现只有有限的价值。虚线往往会在身体和精神上被洗掉,而更微妙的点和破折号组合太微妙(意义,轻微),与实践中的成功相比。

我想说这个问题早在你有 10 个系列之前就已经存在了。除非它们非常不同,否则 5 个左右的系列可能太难区分了。普遍的心理似乎是人们非常了解不同系列由不同颜色或象征意义表示的原则,但缺乏努力追踪个别线条并试图在头脑中讲述它们的异同的故事的倾向. 部分原因通常源于图例(或键)的使用。这是有争议的,但我会尽可能在图表上标记不同的系列。我的座右铭是“失去传奇,或者杀死钥匙,如果可以的话”。

我更喜欢显示多个时间序列的不同方法,其中所有不同的时间序列在几个面板中重复显示,但在每个面板中突出显示不同的时间序列。这是一个旧想法 (a) 小倍数(正如 Edward Tufte 所说的那样)和另一个旧想法 (b) 突出一系列特别兴趣的融合。反过来,它可能只是重新发现的另一个旧想法,但到目前为止我只能找到最近的参考资料。更多关于 Statalist 的帖子

在颜色方面,我很赞成在时间序列中使用灰色作为强调的背景。这似乎与大多数值得发表的期刊一致。

这是一个实验。数据是 1852-1925 年在 Rothamsted 的 Broadbalk 田地的 17 个地块的谷物产量,来自 Andrews, DF 和 Herzberg, AM (Eds) 1985。数据:学生和研究人员的许多领域的问题集合纽约:Springer,表 5.1,可从各个地方下载(例如,在此处输入链接描述。(详细信息:那里的数据以每年 4 行的块形式出现;第三和第四行是秸秆产量,此处未绘制。该表中没有明确的绘图标识符。)

我对这类数据没有专门的专业知识;我只是想要一个不能(容易)被认为在系列长度或面板数量方面微不足道的多时间序列。(如果你有成百上千……的面板,这种方法真的帮不上什么忙。)我想象的是,数据分析师,也许与主题专家交谈,可以识别出各种常见的和在这里不常见的行为,从而获得见解和信息。

在此处输入图像描述

显然,这个配方可以用于许多其他类型的图(例如散点图或直方图,每个子集依次突出显示);连同根据一些有趣或有用的度量或标准(例如按中位数或第 90 个百分位数或 SD)排序面板;以及模型结果和原始数据。

您自己回答的问题 2 和 3 - 颜色 brewer 调色板是合适的。最难的问题是 1,但像尼克一样,恐怕它是基于虚假的希望。线条的颜色并不是让人们能够轻松区分线条的原因,而是基于线条的连续性和线条的曲折程度。因此,除了线条的颜色或虚线图案之外,还有基于设计的选择,这将有助于使情节更容易解释。

我将窃取 Frank 的一张图表,该图表显示了样条曲线在有限域内逼近许多不同形状函数的灵活性作为示例。

#code adapted from http://biostat.mc.vanderbilt.edu/wiki/pub/Main/RmS/rms.pdf page 40
library(Hmisc)
x <- rcspline.eval(seq(0,1,.01), knots=seq(.05,.95,length=5), inclx=T)
xm <- x
xm[xm > .0106] <- NA
x <- seq(0,1,length=300)
nk <- 6
set.seed(15)
knots<-seq(.05,.95,length=nk)
xx<-rcspline.eval(x,knots=knots,inclx=T)
for(i in 1:(nk−1)){
  xx[,i]<-(xx[,i]−min(xx[,i]))/
  (max(xx[,i])−min(xx[,i]))
for(i in 1:20){
  beta<-2∗runif(nk−1)−1
  xbeta<-xx%∗%beta+2∗runif(1)−1
  xbeta<-(xbeta−min(xbeta))/
         (max(xbeta)−min(xbeta))
  if (i==1){
  id <- i
  MyData <- data.frame(cbind(x,xbeta,id))
  }
  else {
          id <- i
          MyData <- rbind(MyData,cbind(x,xbeta,id))
       }
  }
}
MyData$id <- as.factor(MyData$id)

现在这会产生相当混乱的 20 行代码,这是一个难以想象的挑战。

library(ggplot2)
p1 <- ggplot(data = MyData, aes(x = x, y = V2, group = id)) + geom_line()
p1

乱线

这是使用包裹面板的小倍数相同大小的相同图。跨面板进行比较稍微困难一些,但即使在缩小的空间中,也更容易可视化线条的形状。

p2 <- p1 + facet_wrap(~id) + scale_x_continuous(breaks=c(0.2,0.5,0.8))
p2

所有 20 个面板

斯蒂芬科斯林在他的书中提出的一点是,不是有多少不同的线条使情节复杂,而是线条可以采用多少不同类型的形状。如果 20 个面板最终太小,您可以经常将集合减少到相似的轨迹以放置在同一个面板中。仍然很难区分面板内的线条,根据定义,它们将在每条线附近并经常重叠,但它大大降低了面板比较之间的复杂性。在这里,我将 20 行任意减少为 4 个单独的分组。这有一个额外的好处,即直接标记线条更简单,面板内有更多空间。

###############1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
newLevels <- c(1,1,2,2,2,2,2,1,1, 2, 3, 3, 3, 3, 2, 4, 1, 1, 2, 1)
MyData$idGroup <- factor(newLevels[MyData$id])
p3 <- ggplot(data = MyData, aes(x = x, y = V2, group = id)) + geom_line() + 
             facet_wrap(~idGroup)
p3

减少面板

有一个通用的短语适用于这种情况,如果你专注于一切,那么你什么都不专注在只有十行的情况下,您(10*9)/2=45可以比较可能的行对。在大多数情况下,我们可能对所有 45 种比较都不感兴趣,我们要么对比较特定行之间的比较感兴趣,要么将一行与其余行的分布进行比较。尼克的回答很好地表明了后者。将背景线画细、浅色和半透明,然后以任何亮色和粗线画出前景线就足够了。(同样对于设备,请确保将前景线绘制在其他线的顶部!)

创建一个层次结构要困难得多,其中每条线都可以在缠结中轻松区分。在制图学中实现前景-背景区分的一种方法是使用阴影(参见Dan Carr的这篇论文中的一个很好的例子)。这不会扩展到 10 行,但可以帮助 2 或 3 行。这是面板 1 中使用 Excel 的轨迹示例!

Excel 阴影

还有其他要点,例如如果您的轨迹不平滑,浅灰色线可能会产生误导。例如,您可以有两条 X 形的轨迹,或两条正面朝上和倒置 V 形的轨迹。将它们绘制成相同的颜色,您将无法追踪线条,这就是为什么有些人建议使用平滑线或抖动/偏移点绘制平行坐标图(Graham and Kennedy, 2003 ; Dang et al., 2010)。

因此,设计建议可能会根据最终目标和数据性质而改变。但是当在轨迹之间进行双变量比较时,我认为相似轨迹的聚类和使用小的倍数使得在各种情况下更容易解释图。我觉得这通常比任何颜色/虚线组合在复杂的图中更有效率。许多文章中的单面板图比它们需要的大得多,并且通常可以在页面限制内拆分为 4 个面板而不会造成太大损失。

来自 Trevor Hastie 等人的“统计学习的要素”。

“我们的第一版对色盲读者不友好;特别是我们倾向于偏爱特别麻烦的红/绿对比。我们在这一版中很大程度上改变了调色板,用橙色/蓝色对比代替了上面的调色板。 "

你可能想看看他们的图表。

您也可以使用虚线、点线等。

在适当的数据可视化方面,我很少关注“线条粗细”。也许辨别不同线条粗细的能力不像辨别颜色的能力那样多变。

一些资源:

  1. Hadley Wickham (2009),ggplot:用于数据分析的优雅图形,Springer;有一个支持网页
  2. 8 种关于数据可视化的推荐书籍资源: http ://www.tableausoftware.com/about/blog/2013/7/list-books-about-data-visualisation-24182

一些课程:

  1. Thomas Lumley 的生物统计学入门计算课程中的图形讲座
  2. Ross Ihaka 的计算数据分析和图形研究生课程
  3. Ross Ihaka 的信息可视化本科课程
  4. Deborah Nolan 的本科课程“数据计算概念”
  5. Hadley Wickham 的数据可视化课程