【问题标题】:Break each 4 months when axis x is numeric (number of the week) ggplot2当轴 x 为数字(周数)ggplot2 时,每 4 个月中断一次
【发布时间】:2017-04-24 12:04:56
【问题描述】:

我有一个数据框,其中一些日期从 2000 年到 2016 年,还有一些我想绘制的数据。但是,如果我们连续两年比较它们,日期是不相等的:首先日期的值可能不同,其次,我有时在两年之间有一个或多或少的值。

headtail 的 2000、2001 和 2002 年数据:

      numWeek effectif numYear numWeektest         numWeek effectif numYear numWeektest        numWeek effectif numYear numWeektest
1: 2000-01-03        1    2000           1   1: 2001-01-01       13    2001           1  1: 2002-01-07       77    2002           1
2: 2000-01-10        0    2000           2   2: 2001-01-08       22    2001           2  2: 2002-01-14       95    2002           2
3: 2000-01-17        0    2000           3   3: 2001-01-15       21    2001           3  3: 2002-01-21       69    2002           3
4: 2000-01-24        0    2000           4   4: 2001-01-22       11    2001           4  4: 2002-01-28       91    2002           4
5: 2000-01-31        0    2000           5   5: 2001-01-29       24    2001           5  5: 2002-02-04       89    2002           5

      numWeek effectif numYear numWeektest       numWeek effectif numYear numWeektest       numWeek effectif numYear numWeektest
48: 2000-11-27       14    2000          48 49: 2001-12-03       53    2001          49 48: 2002-12-02      112    2002          48
49: 2000-12-04       14    2000          49 50: 2001-12-10       65    2001          50 49: 2002-12-09      171    2002          49
50: 2000-12-11       12    2000          50 51: 2001-12-17       66    2001          51 50: 2002-12-16      132    2002          50
51: 2000-12-18       13    2000          51 52: 2001-12-24       17    2001          52 51: 2002-12-23       35    2002          51
52: 2000-12-25        4    2000          52 53: 2001-12-31       28    2001          53 52: 2002-12-30       54    2002          52

numWeektest 是星期几。你可以看到我有时有一年的5253 值。

所以我所做的是获取周数,按年份绘制它,我得到了这个:

它工作得很好,但我想做的是将轴 x 打破 4 个月,但我不能这样做,因为我的 x 轴是 numeric 而不是 Date。我试图改变 x 轴,但后来我得到了这个:

那我该怎么办呢?

代码:

test_p <-ggplot(test_c, aes(x = numWeek, y = effectif, group = numYear, colour = as.factor(numYear))) + 
  geom_line() +
  geom_point() +
  theme_bw() + 
  scale_y_discrete(expand = c(0,0)) +
  #scale_x_discrete(expand = c(0,0.5)) replace discrete or date according to the x axis values
  scale_x_date(expand = c(0,0.5))

编辑:

我想要的是(用Paint修改过):

数据:

structure(list(numWeek = structure(c(10959, 10966, 10973, 10980, 
10987, 10994, 11001, 11008, 11015, 11022, 11029, 11036, 11043, 
11050, 11057, 11064, 11071, 11078, 11085, 11092, 11099, 11106, 
11113, 11120, 11127, 11134, 11141, 11148, 11155, 11162, 11169, 
11176, 11183, 11190, 11197, 11204, 11211, 11218, 11225, 11232, 
11239, 11246, 11253, 11260, 11267, 11274, 11281, 11288, 11295, 
11302, 11309, 11316, 11323, 11330, 11337, 11344, 11351, 11358, 
11365, 11372, 11379, 11386, 11393, 11400, 11407, 11414, 11421, 
11428, 11435, 11442, 11449, 11456, 11463, 11470, 11477, 11484, 
11491, 11498, 11505, 11512, 11519, 11526, 11533, 11540, 11547, 
11554, 11561, 11568, 11575, 11582, 11589, 11596, 11603, 11610, 
11617, 11624, 11631, 11638, 11645, 11652, 11659, 11666, 11673, 
11680, 11687, 11694, 11701, 11708, 11715, 11722, 11729, 11736, 
11743, 11750, 11757, 11764, 11771, 11778, 11785, 11792, 11799, 
11806, 11813, 11820, 11827, 11834, 11841, 11848, 11855, 11862, 
11869, 11876, 11883, 11890, 11897, 11904, 11911, 11918, 11925, 
11932, 11939, 11946, 11953, 11960, 11967, 11974, 11981, 11988, 
11995, 12002, 12009, 12016, 12023, 12030, 12037, 12044, 12051
), class = "Date"), effectif = c(1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 
1, 0, 0, 0, 1, 0, 0, 1, 4, 3, 4, 5, 8, 4, 12, 6, 6, 7, 3, 0, 
15, 7, 2, 8, 12, 12, 7, 9, 14, 9, 22, 10, 17, 12, 14, 9, 14, 
14, 14, 12, 13, 4, 13, 22, 21, 11, 24, 20, 20, 20, 26, 23, 43, 
16, 30, 29, 20, 25, 35, 48, 35, 43, 35, 34, 26, 45, 68, 45, 44, 
49, 33, 35, 24, 27, 24, 36, 60, 51, 47, 39, 41, 58, 45, 42, 72, 
26, 67, 59, 63, 70, 53, 65, 66, 17, 28, 77, 95, 69, 91, 89, 84, 
77, 91, 80, 109, 92, 116, 87, 87, 87, 102, 91, 74, 90, 80, 96, 
53, 100, 101, 114, 90, 84, 77, 77, 74, 76, 25, 45, 33, 121, 121, 
89, 96, 121, 108, 131, 128, 108, 159, 126, 136, 135, 112, 171, 
132, 35, 54), numYear = c(2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 
2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 
2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 
2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 
2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 2001, 
2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 
2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 
2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 
2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 
2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002), numWeektest = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 
30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 
43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 
30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 
43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L)), class = "data.frame", row.names = c(NA, 
-157L), .internal.selfref = <pointer: 0x0000000007a90788>, .Names = c("numWeek", 
"effectif", "numYear", "numWeektest"))

【问题讨论】:

  • 您能详细说明将 x 轴缩短 4 个月吗?
  • @RobinGertenbach 哦,是的,我希望在 x 轴上每 4 个月有一条线,这样它将从 1 月开始,然后从 5 月开始,然后从 9 月开始,而不是周数
  • @RobinGertenbach 如果您想了解我所说的每 4 个月中断一次是什么意思,我会给出预期结果

标签: r date ggplot2


【解决方案1】:

你可以这样做:

test_c$dateNew <- as.Date(paste("2001-",format(test_c$numWeek, format="%m-%d")), format = "%Y-%m-%d")

test_p <-ggplot(test_c, aes(x = dateNew, y = effectif, group = numYear, colour = as.factor(numYear))) + 
  geom_line() +
  geom_point() +
  theme_bw() + 
  scale_y_discrete(expand = c(0,0)) +
  scale_x_date(date_breaks = "4 months", date_labels = "%B")

我所做的是将日期转换为普通年份,因此 1 月至 12 月将仅在 x 轴上显示一次(而不是每年的 1 月 - 12 月)。然后我每 4 个月格式化一次日期并使用月份标签。

请注意,我将您的“每 4 个月”解释为 4 月 (04)、8 月 (08) 和 12 月 (12)。

编辑:对于您的 jan/may/sept 休息时间,您可以将最后一行替换为:

 scale_x_date(breaks = as.Date(c("2001-01-01","2001-05-01","2001-09-01")), date_labels = "%B")

这给出了:

【讨论】:

  • 简单的把戏,但很聪明,我没想过。您回答的小“问题”是我希望将每个因素的值保持在同一 x 线上,这就是为什么我首先尝试使用周数来做到这一点。我不知道你是否明白,例如,蓝色的第一个值比其他两个值更靠右。但我不知道是否有可能做这样的事情。 (如果您有任何想法,请告诉我)。无论如何,谢谢你的回答。 :)
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2017-08-04
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多