绘制 2 个日历年的儒略日期

plotting julian dates across 2 calendar years

我确定这会被标记为重复,但我似乎找不到解决方案。

我有一个数据集,其中包含随时间测量的大气中的氮气。从每年的 11 月到 2 月(约 20 年)每天收集测量值。日期采用 Julian 格式。 ggplot2 中的默认规范将 2 月视为第一个月,应该是 11 月。我该如何解决这个问题,同时牢记 x 轴应该为真(例如,11 月 - 12 月 - 1 月 - 2 月)。提前致谢。

structure(list(nitro = c(36, 51, 23, 7, 26, 62, 45, 25, 31, 70, 
23, 63, 41, 61, 6, 24, 2, 6, 47, 22, 6, 48, 16, 25, 61, 9, 63, 
3, 22, 27, 52, 9, 34, 48, 31, 16, 51, 63, 21, 42, 4, 9, 20, 28, 
23, 0, 23, 70, 47, 2, 52.0898926784594, 55.8022284640568, 41.3593089128863, 
57.9928202206287, 35.4624211011211, 65.2484486428607, 39.236626265918, 
40.8906848288849, 65.7044590718657, 39.9377208120021, 51.1368297792738, 
46.3981830973577, 36.3795615108741, 59.4071137999101, 42.77053802297, 
51.4293854584156, 45.3589706700315, 53.9652146584217, 54.6980728446628, 
43.1278297603877, 48.2879709803009, 60.0627232974633, 49.5233404192228, 
55.4231572422576, 35.9842318889366, 55.649768270307, 61.8309485366259, 
63.1600858734154, 52.9116478602541, 48.5690637010561, 49.4065375720883, 
44.7880773761964, 48.5893427534388, 43.5882970429564, 33.0365374509187, 
40.2149387649389, 67.3129711280128, 55.491540487927, 63.5614232930341, 
53.6421935293565, 47.0292298358771, 62.5727076637489, 32.2728901281264, 
61.7219468394218, 40.0865833610807, 24.1288862068719, 62.8734959914056, 
52.3161174228334, 32.6827415750796, 50.3593375610126), juliandate = c(323L, 
346L, 318L, 314L, 324L, 325L, 311L, 342L, 341L, 348L, 328L, 345L, 
328L, 328L, 326L, 312L, 340L, 331L, 326L, 320L, 359L, 323L, 312L, 
337L, 347L, 351L, 352L, 320L, 326L, 345L, 352L, 342L, 312L, 323L, 
333L, 348L, 340L, 330L, 338L, 323L, 356L, 345L, 359L, 334L, 320L, 
349L, 358L, 355L, 321L, 324L, 6L, 52L, 46L, 21L, 47L, 1L, 43L, 
14L, 48L, 2L, 60L, 21L, 27L, 26L, 37L, 51L, 2L, 1L, 43L, 57L, 
23L, 49L, 10L, 38L, 58L, 20L, 3L, 45L, 1L, 17L, 30L, 42L, 5L, 
58L, 1L, 4L, 7L, 38L, 56L, 53L, 14L, 46L, 54L, 36L, 52L, 6L, 
32L, 35L, 46L, 3L)), .Names = c("nitro", "juliandate"), row.names = c(NA, 
100L), class = "data.frame")

ggplot(d,aes(juliandate,nitro))+geom_point() #plot - should start at julian 305, end at julian 60

我看到的最佳解决方案是将它们全部映射到单个年份并使用 ggplot2 功能绘制该年份以使日期看起来像 Julian 日期。

所以解决方案分为两部分,映射和显示。在您的应用程序中,我会将这些实现为数据框中的单独列。

下面介绍的解决方案使用包装函数 (j2d) 来包装日期 mid-year(180 天)的映射。然后它使用 ggplot2 函数 scale_x_date 将输出日期转换为 Julian 格式:

library(ggplot2)

j2d <- function(n){
  n <- ifelse( n<180, n+365, n ) # wrap at midyear
  d <- as.Date("2015-01-01") + n
  return(d)
}

df <-
  structure(
    list( 
      nitro = 
        c(36, 51, 23, 7, 26, 62, 45, 25, 31, 70, 
          23, 63, 41, 61, 6, 24, 2, 6, 47, 22, 6, 48, 16, 25, 61, 9, 63, 
          3, 22, 27, 52, 9, 34, 48, 31, 16, 51, 63, 21, 42, 4, 9, 20, 28, 
          23, 0, 23, 70, 47, 2, 52.0898926784594, 55.8022284640568, 41.3593089128863, 
          57.9928202206287, 35.4624211011211, 65.2484486428607, 39.236626265918, 
          40.8906848288849, 65.7044590718657, 39.9377208120021, 51.1368297792738, 
          46.3981830973577, 36.3795615108741, 59.4071137999101, 42.77053802297, 
          51.4293854584156, 45.3589706700315, 53.9652146584217, 54.6980728446628, 
          43.1278297603877, 48.2879709803009, 60.0627232974633, 49.5233404192228, 
          55.4231572422576, 35.9842318889366, 55.649768270307, 61.8309485366259, 
          63.1600858734154, 52.9116478602541, 48.5690637010561, 49.4065375720883, 
          44.7880773761964, 48.5893427534388, 43.5882970429564, 33.0365374509187, 
          40.2149387649389, 67.3129711280128, 55.491540487927, 63.5614232930341, 
          53.6421935293565, 47.0292298358771, 62.5727076637489, 32.2728901281264, 
          61.7219468394218, 40.0865833610807, 24.1288862068719, 62.8734959914056, 
          52.3161174228334, 32.6827415750796, 50.3593375610126), 
      juliandate = 
        c(323L, 
          346L, 318L, 314L, 324L, 325L, 311L, 342L, 341L, 348L, 328L, 345L, 
          328L, 328L, 326L, 312L, 340L, 331L, 326L, 320L, 359L, 323L, 312L, 
          337L, 347L, 351L, 352L, 320L, 326L, 345L, 352L, 342L, 312L, 323L, 
          333L, 348L, 340L, 330L, 338L, 323L, 356L, 345L, 359L, 334L, 320L, 
          349L, 358L, 355L, 321L, 324L, 6L, 52L, 46L, 21L, 47L, 1L, 43L, 
          14L, 48L, 2L, 60L, 21L, 27L, 26L, 37L, 51L, 2L, 1L, 43L, 57L, 
          23L, 49L, 10L, 38L, 58L, 20L, 3L, 45L, 1L, 17L, 30L, 42L, 5L, 
          58L, 1L, 4L, 7L, 38L, 56L, 53L, 14L, 46L, 54L, 36L, 52L, 6L, 
          32L, 35L, 46L, 3L)), 
    .Names = c("nitro", "juliandate"), 
    row.names = c(NA, 100L), class = "data.frame")

df$juliandate<-j2d(df$juliandate)

ggplot(df,aes(juliandate,nitro))+
  geom_point() +
  scale_x_date(labels = date_format("%j"))

产量: