使用ggplot在最大点上绘制平滑线

时间:2019-10-21 23:59:36

标签: r ggplot2 time-series

我正在努力使用ggplot在数据框下方绘制图形,以便进一步在蓝点上拟合第二条平滑线。任何帮助表示赞赏:

数据集

structure(list(dates = structure(c(3677, 3683, 3712, 3743, 3773, 
3804, 3834, 3865, 3896, 3926, 3957, 3987, 4026, 4049, 4077, 4108, 
4151, 4169, 4199, 4230, 4272, 4291, 4322, 4352, 4410, 4414, 4442, 
4473, 4514, 4534, 4564, 4595, 4635, 4656, 4687, 4717, 4778, 4779, 
4807, 4838, 4878, 4899, 4929, 4960, 4999, 5021, 5052, 5082, 5129, 
5144, 5173, 5204, 5241, 5265, 5295, 5326, 5362, 5387, 5418, 5448, 
5487, 5510, 5538, 5569, 5604, 5630, 5660, 5691, 5725, 5752, 5783, 
5813, 5846, 5875, 5903, 5934, 5968, 5995, 6025, 6056, 6089, 6117, 
6148, 6206, 6210, 6240, 6268, 6299, 6332, 6360, 6390, 6451, 6453, 
6482, 6513, 6573, 6580, 6605, 6634, 6694, 6695, 6726, 6756, 6816, 
6818, 6848, 6879, 6932, 6940, 6992, 6999, 7059, 7060, 7091, 7121, 
7180, 7183, 7213, 7254, 7298, 7334, 7336, 7364, 7411, 7425, 7456, 
7486, 7544, 7548, 7578, 7609, 7663, 7698, 7701, 7729, 7787, 7790, 
7821, 7851, 7908, 7913, 7943, 7974, 8033, 8056, 8066, 8095, 8150, 
8156, 8187, 8217, 8271, 8279, 8337, 8340, 8398, 8401, 8432, 8488, 
8513, 8521, 8552, 8582, 8634, 8644, 8701, 8705, 8765, 8782, 8797, 
8852, 8884, 8886, 8917, 8977, 8997, 9009, 9065, 9098, 9130, 9142, 
9162, 9190, 9239, 9251, 9282, 9340, 9360, 9374, 9425, 9458, 9492, 
9496, 9527, 9583, 9602, 9617, 9648, 9703, 9723, 9740, 9793, 9801, 
9842, 9891, 9893, 9935, 9975, 10004, 10041, 10069, 10086, 10105, 
10163, 10185, 10207, 10233, 10276, 10290, 10329, 10347, 10407, 
10429, 10449, 10470, 10512, 10537, 10580, 10618, 10649, 10672, 
10703, 10723, 10771, 10778, 10834, 10848, 10867, 10924, 10951, 
10978, 10990, 11027, 11068, 11108), class = "Date"), freq = c(20, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 67, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 2, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 94, 
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 39, 0, 4, 0, 0, 0, 0, 0, 0, 
0, 0, 7, 31, 1, 7, 1, 1, 0, 1, 0, 0, 1, 4, 9, 67, 4, 6, 0, 0, 
0, 0, 0, 0, 5, 4, 5, 34, 0, 3, 0, 1, 0, 0, 1, 1, 2, 0, 6, 8, 
5, 2, 2, 1)), row.names = c(1L, 32L, 61L, 92L, 122L, 153L, 183L, 
214L, 245L, 275L, 306L, 336L, 367L, 398L, 426L, 457L, 487L, 518L, 
548L, 579L, 610L, 640L, 671L, 701L, 732L, 763L, 791L, 822L, 852L, 
883L, 913L, 944L, 975L, 1005L, 1036L, 1066L, 1097L, 1128L, 1156L, 
1187L, 1217L, 1248L, 1278L, 1309L, 1340L, 1370L, 1401L, 1431L, 
1462L, 1493L, 1522L, 1553L, 1583L, 1614L, 1644L, 1675L, 1706L, 
1736L, 1767L, 1797L, 1828L, 1859L, 1887L, 1918L, 1948L, 1979L, 
2009L, 2040L, 2071L, 2101L, 2132L, 2162L, 2193L, 2224L, 2252L, 
2283L, 2313L, 2344L, 2374L, 2405L, 2436L, 2466L, 2497L, 2527L, 
2558L, 2589L, 2617L, 2648L, 2678L, 2709L, 2739L, 2770L, 2801L, 
2831L, 2862L, 2892L, 2923L, 2954L, 2983L, 3014L, 3044L, 3075L, 
3105L, 3136L, 3167L, 3197L, 3228L, 3258L, 3289L, 3320L, 3348L, 
3379L, 3409L, 3440L, 3470L, 3501L, 3532L, 3562L, 3593L, 3623L, 
3654L, 3685L, 3713L, 3744L, 3774L, 3805L, 3835L, 3866L, 3897L, 
3927L, 3958L, 3988L, 4019L, 4050L, 4078L, 4109L, 4139L, 4170L, 
4200L, 4231L, 4262L, 4292L, 4323L, 4353L, 4384L, 4415L, 4444L, 
4475L, 4505L, 4536L, 4566L, 4597L, 4628L, 4658L, 4689L, 4719L, 
4750L, 4781L, 4809L, 4840L, 4870L, 4901L, 4931L, 4962L, 4993L, 
5023L, 5054L, 5084L, 5115L, 5146L, 5174L, 5205L, 5235L, 5266L, 
5296L, 5327L, 5358L, 5388L, 5419L, 5449L, 5480L, 5511L, 5539L, 
5570L, 5600L, 5631L, 5661L, 5692L, 5723L, 5753L, 5784L, 5814L, 
5845L, 5876L, 5905L, 5936L, 5966L, 5997L, 6027L, 6058L, 6089L, 
6119L, 6150L, 6180L, 6211L, 6242L, 6270L, 6301L, 6331L, 6362L, 
6392L, 6423L, 6454L, 6484L, 6515L, 6545L, 6576L, 6607L, 6635L, 
6666L, 6696L, 6727L, 6757L, 6788L, 6819L, 6849L, 6880L, 6910L, 
6941L, 6972L, 7000L, 7031L, 7061L, 7092L, 7122L, 7153L, 7184L, 
7214L, 7245L, 7275L, 7306L, 7337L, 7366L, 7397L, 7427L), class = "data.frame")

我到目前为止所做的事情

ggplot(df, aes(x=dates , y=freq)) +
          xlab("") + ylab("Frequency") +
          tidyquant::theme_tq() +
          theme(axis.title.y = element_text(face="bold", size=8))+
          geom_line(color = "black", size = 0.5) +
          scale_x_date(date_labels = "%b/%Y", date_breaks="5 year") +
          ggpmisc::stat_peaks(colour = "blue",  span = 9, size = 1.5, ignore_threshold=0.001) +
          scale_y_continuous(limits = c(0, 100)) +
          labs(title = "")

enter image description here

1 个答案:

答案 0 :(得分:1)

最初,我希望提供与geom不同的stat_peaks,但是这条路没有带我到任何地方。

但是,我可以想到以下解决方法:

查看ggpmisc::StatPeaks$compute_group,您会发现工作马函数为ggpmisc:::find_peaks,您可以使用它来检索峰值数据并添加如下平滑​​器:

p <- ggplot(df, aes(x=dates , y=freq)) +
          xlab("") + ylab("Frequency") +
          tidyquant::theme_tq() +
          theme(axis.title.y = element_text(face = "bold", size = 8))+
          geom_line(color = "black", size = 0.5) +
          scale_x_date(date_labels = "%b/%Y", date_breaks = "5 year") +
          ggpmisc::stat_peaks(colour           = "blue",  
                              span             = 9, 
                              size             = 1.5, 
                              ignore_threshold = 0.001) +
          scale_y_continuous(limits = c(0, 100)) +
          labs(title = "")

p + geom_smooth(data = df[ggpmisc:::find_peaks(df$freq, 
                                               span = 9, 
                                               ignore_threshold = 0.001), ])

这将产生以下图: Smoother

相关问题