在图表上显示三条信息

机器算法验证 数据可视化
2022-02-02 07:28:46

注:现附上50点原始数据。

我想显示我完成了多少学习,以及我整个星期完成了多少页,按天细分,我这样做如下所示:在此处输入图像描述

有人告诉我他们无法理解这些图表,但我不知道我还能如何显示它们。因为我基本上需要三个维度而不进行累积描述。我想避免使用大量的折线图,因为几周后这些图将变得难以辨认。我没有什么可以做的吗?

我怎样才能更清楚地显示这些?

Date        Total   Total pages
21/11/2014  2.4166   0
22/11/2014  0        0
23/11/2014  1.5833   4
24/11/2014  3.0166  13
25/11/2014  2.4999   6
26/11/2014  1.4833   3
27/11/2014  3.0499   6
28/11/2014  0        0
29/11/2014  2.4499   5
30/11/2014  2.8833   2
 1/12/2014  0        0
 2/12/2014  4.1166   8
 3/12/2014  1.3333   5
 4/12/2014  1.2499   3
 5/12/2014  1.6666   8
 6/12/2014  0        0
 7/12/2014  2.4833   9
29/12/2014  0        0
30/12/2014  1.2332   1
31/12/2014  0.3333   0
 1/01/2015  3.5666   2
 2/01/2015  0.8166   0
 3/01/2015  2.75    28
 4/01/2015  0.4166   0
 5/01/2015  1.2833   0
 6/01/2015  0.3333   3
 7/01/2015  0        0
 8/01/2015  0        0
 9/01/2015  2.35     2
10/01/2015  0.5666   0
11/01/2015  0        0
12/01/2015  1.6666   0
13/01/2015  2.2666   5
14/01/2015  2.5165   6
15/01/2015  2.0166   0
16/01/2015  2.9666   1
17/01/2015  0.8333   0
18/01/2015  0.6666   1
19/01/2015  1.45     0
20/01/2015  0.3166   0
21/01/2015  0        0
22/01/2015  0.2333   0
23/01/2015  0.85     2
24/01/2015  0        0
25/01/2015  0        0
26/01/2015  0.6666   4
27/01/2015  0.8333   1
28/01/2015  1.5498   5
29/01/2015  6.4159   9
30/01/2015  2.9166   0
4个回答

可视化基于日期/日历的数据的一种方法是通过矩阵显示器,用颜色对数据进行编码。矩阵(或表格)的排列方式使行代表周,列代表天。如果需要,您可以为每周总计添加最后一列。

如果数据排列正确,这可以在带有条件格式的 Excel 中稍微简单地实现。特别是,您可以使用查找原始数据的公式构建值的“网格”。从那里,您可以使用条件格式来显示结果。

这是结果的样子。抱歉,我更改了日期格式。单元格 H1 中的公式为:"=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)"它正在做一些数学运算以使日子按正确的顺序排列。希望它是直截了当的。

具有矩阵排列的条件格式的图像

如果您真的想挑战极限,您可以使用d3 之类的框架及其日历插件来显示这些数据。不过,这可能比它的价值更大。

这种格式与 GitHub 随时间显示用户活动/贡献的方式非常相似。这是一个用户(不是我!)。 在此处输入图像描述

原版的突出特点是每周总和。只有在您了解了颜色之后,各个值才有意义,我想这是该情节不适用于新观众的一个重要原因。与此相关的是,日子的时间方面丢失了。一组连续的颜色可能会有所帮助(例如,7 种蓝色)。

我通常不在乎给每个项目都贴上标签——确切的值重要吗?如果您在没有标记每个值的情况下无法解释该图表,则该图表无法完成其工作。

继续我的尝试鉴于每周总和的明显重要性,我绘制了每周累积总和。它按时间顺序显示每周总和和天数。确切的日期值不太清楚,但异常值仍然会脱颖而出。

对于这些类型的小线图(可以缩小到迷你图大小),有参考线或区域会很有帮助。为了说明,我添加了一个目标范围。如果目标不合适,则参考可能是过去三周的范围或某个固定参考值。

在此处输入图像描述

我用红色表示哪些周低于快速扫描的目标。

再过几个星期,您可能会将它们组织成一个网格,而不是一个垂直列表。

在此处输入图像描述

据我了解您的问题,分开显示小时数和页数是可行的。我会先这样做。之后,我将在一个图中显示 Total 和 Pages。我猜实际数字并不是最重要的——更重要的是要了解周和工作日的概况,哪些是富有成效的,哪些不是。在这种情况下,我建议您保留自然的时间结构,因为您的数据中实际上只有一个时间维度。我们仍然可以找到一种方法来划分星期。

我使用以下 R 代码和 ggplot2-package 来生成第一个图。您的数据已加载到以下代码中的对象数据中。该图是一个分组条形图,灰色条表示每周的页面总和。

data <- rbind(data.frame(Date = c("17/11/2014", "18/11/2014", "19/11/2014", "20/11/2014"),
                         Total = rep(0, 4),
                         Pages = rep(0, 4)), 
              data,
              data.frame(Date = c("31/01/2015", "01/02/2015"),
                         Total = c(0, 0),
                         Pages = c(0, 0)))

n <- dim(data)[1]

data$Date <- as.Date(data$Date, format = "%d/%m/%Y")
data$weekday <- factor(rep(c("Monday", "Tuesday", "Wednesday", "Thursday",
                             "Friday", "Saturday", "Sunday"), length.out = n))
data$weekday <- factor(data$weekday, levels(data$weekday)[c(2,6,7,5,1,3,4)])
data$week <- factor(rep(seq(from = 0, to = ceiling(((n - 3)/7))), 
                        each = 7, length.out = n))

ggplot(data = data, aes(x = week, y = Pages)) + 
  geom_bar(aes(fill = weekday), stat = "identity", position = "dodge") + 
  labs(fill = NULL) + xlab(NULL) + ylab("Number of pages") + 
  geom_bar(stat = "identity", alpha = 0.2) + theme(panel.background = element_blank()) +
  scale_x_discrete(labels = paste("Week", seq(from = 0, to = 7)))

灰色条的高度表示页面的周总和。

这显然并不完美。灰色条占主导地位,因为与日间条相比,相同的阅读量具有更大的区域。我们可以让它们更薄,但我喜欢它们划分星期的方式。它们很好地表明了同一周的哪几天——否则就不一定能理解。特别是因为我们的计数为零。

在下一个图中,我使用平均页数(一周内)作为灰色条的高度。

灰色条的高度表示页面的周平均值。

这可能更好地代表数据。但是,请注意第 0 周和第 7 周具有误导性,因为它们不包括 7 天。您可以轻松解决此问题。

如果你坚持同时显示页面和时间,你可以做一个背靠背的条形图。这可能有点令人困惑,因为两个垂直比例不同。另一方面,像这样直接比较花费的时间和完成的工作可能会很好。

在背靠背的情节中结合时间和页面。

编辑:意识到颜色真的不需要那么多并且受到 xan 的启发(见下面的评论),你可以将情节简化为这样的东西。我已经标记了星期四以提供额外的视觉指南。您也可以主张对所有条形使用相同的颜色,以免过分强调某些(任意)日子。

一个更简单的版本。

最后一点,您还可以尝试通过将值除以平均值来以不同方式缩放轴。这将使 1 成为“正常”值。我们可以在 1 处添加一条线来强调这一点——现在在背靠背图上完成。这在平均工作量方面将“好”天与“坏”天区分开来。

在此处输入图像描述

在这个图上,我们还可以确保一个单位对应于两个轴上的相同距离,因为它们现在是可比较的。

另请注意,我在第一个版本中搞砸了日子。我已经更正了代码和绘图,现在我将去练习一周中的 7 天。

产生最后一个情节的代码:

data$normPages <- data$Pages/mean(data$Pages)
data$normTotal <- data$Total/mean(data$Total)

data$weekNormPages <- data$Pages/(7*mean(data$Pages))
data$weekNormTotal <- data$Total/(7*mean(data$Total))

pTop <- ggplot(data = data, aes(x = week)) + geom_bar(aes(linetype = weekday, y = normPages), 
                                                      stat = "identity", position = "dodge", 
                                                      fill = "dodgerblue") + labs(fill = NULL) +
  xlab(NULL) + ylab("Number of pages") + geom_bar(aes(y = weekNormPages), stat = "identity", alpha = 0.3) + 
  theme(panel.background = element_blank(), axis.ticks.length=unit(0,"cm")) + guides(linetype = FALSE) +
  scale_x_discrete(labels = paste("Week", seq(from = 0, to = 7))) + ylab(NULL) + 
  annotate("text", label = "Pages read", x = "1", y = 10) +
  theme(plot.margin = unit(c(1,.5,.1,.8), "cm")) + geom_hline(yintercept = 1)
pTop

pBot <- ggplot(data = data, aes(x = week)) + geom_bar(aes(linetype = weekday, y = normTotal), 
                                                      stat = "identity", position = "dodge", fill = "dodgerblue") + 
  labs(fill = NULL) +
  xlab(NULL) + ylab("Number of hours") + geom_bar(aes(y = weekNormPages), stat = "identity", alpha = 0.3) + 
  theme(panel.background = element_blank(), axis.ticks.length=unit(0,"cm")) + guides(linetype = FALSE) + 
  scale_x_discrete(labels = NULL) + guides(fill = FALSE) + ylab(NULL) + scale_y_reverse() + 
  theme(plot.margin = unit(c(.1,.5,1,.8), "cm")) + 
  annotate("text", label = "Time spent", x = "1", y = 4) + geom_hline(yintercept = 1)
pBot

grid.arrange(pTop, pBot, heights = c(.5, .5), widths = c(0.5, 0.1))

如果我理解正确,您不想使用折线图的原因是您有太多周并且图表会变得混乱。

如果这是问题所在,那么您可以将时间序列划分为组件:

每日变化

每周变化

长期趋势

还要别的吗。

William S. Cleveland 在他的一本书中展示了一个很好的例子(我不在办公室,不记得他的哪本书有这个例子,但它要么是可视化数据要么是图形数据的元素)。

R 和 SAS 都有执行此操作的工具。您可以访问其中任何一个吗?