据我了解您的问题,分开显示小时数和页数是可行的。我会先这样做。之后,我将在一个图中显示 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))