簡體   English   中英

沒有數據時如何避免geom_line或geom_path中的連接線?

[英]How to avoid the connection lines in geom_line or geom_path when there is no data?

我正在使用 geom_path 繪制平均值的時間序列,並使用 geom_ribbon 添加具有最小最大值的功能區。 時間序列中存在一些數據差距,但 plot 保持連接線。 在隨附的 plot 中,最后一個面板顯示了數據中的差距。 該數據沒有 x 或 y 條目。 有什么辦法可以控制這個? 在此處輸入圖像描述

這是頂部面板的 plot 代碼:

ggplot(stat_total, aes(color=gas)) + 
  geom_path(aes(x=date_mean, y=conc_mean, color=gas), size=1.2, na.rm = T) +          
  geom_ribbon(aes(x=date_mean, ymin=conc_min, ymax=conc_max, fill=gas), color="grey70", alpha=0.4, na.rm = T)+
      scale_x_datetime(date_breaks = "3 weeks" , date_labels = "%d-%b") + 
      xlab(NULL) +
      ylab('[ppb]') + 
      theme_bw() +
      facet_wrap(gas~.,scales = 'free_x',ncol = 1,nrow=2)

以及數據樣本:

structure(list(day = c(6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 
11L, 11L, 12L, 12L, 13L, 13L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 
18L, 20L, 20L, 21L, 21L, 25L, 25L, 26L, 26L, 27L, 27L, 28L, 28L, 
1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 12L, 12L, 13L, 13L, 14L, 
14L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 
22L, 22L, 23L, 23L, 24L, 24L, 25L, 25L, 26L, 26L, 27L, 27L, 28L, 
28L, 29L, 29L, 30L, 30L, 31L, 31L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 
5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 11L, 11L, 12L, 12L, 13L, 
13L, 26L, 26L, 27L, 27L, 28L, 28L, 29L, 29L, 30L, 30L, 1L, 1L, 
2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 14L, 14L, 15L, 15L, 16L, 16L, 
17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 21L, 21L, 22L, 22L, 23L, 
23L, 24L, 24L, 25L, 25L, 26L, 26L, 27L, 27L, 28L, 28L, 29L, 29L, 
30L, 30L, 31L, 31L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 
6L, 7L, 7L, 8L, 8L, 9L, 9L, 15L, 15L, 16L, 16L, 17L, 17L, 18L, 
18L, 19L, 19L, 20L, 20L, 21L, 21L, 22L, 22L, 24L, 24L, 25L, 25L, 
26L, 26L), month = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), 
    gas = c("AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", "BVOC", "AVOC", 
    "BVOC", "AVOC", "BVOC"), date_mean = structure(c(1549475100, 
    1549475100, 1549542360, 1549542360, 1549620787.5, 1549620787.5, 
    1549710663.15789, 1549710663.15789, 1549801042.10526, 1549801042.10526, 
    1549885680, 1549885680, 1549971100, 1549971100, 1550052300, 
    1550052300, 1550263680, 1550263680, 1550312871.42857, 1550312871.42857, 
    1550406436.36364, 1550406436.36364, 1550475600, 1550475600, 
    1550686320, 1550686320, 1550756700, 1550756700, 1551105981.81818, 
    1551105981.81818, 1551177428.57143, 1551177428.57143, 1551260700, 
    1551260700, 1551351176.47059, 1551351176.47059, 1551442263.15789, 
    1551442263.15789, 1551537771.42857, 1551537771.42857, 1551617052.63158, 
    1551617052.63158, 1551703500, 1551703500, 1551782925, 1551782925, 
    1552427550, 1552427550, 1552499742.85714, 1552499742.85714, 
    1552551075, 1552551075, 1552645800, 1552645800, 1552737120, 
    1552737120, 1552830942.85714, 1552830942.85714, 1552885875, 
    1552885875, 1553019075, 1553019075, 1553065457.14286, 1553065457.14286, 
    1553274000, 1553274000, 1553350725, 1553350725, 1553430857.14286, 
    1553430857.14286, 1553519076.92308, 1553519076.92308, 1553572800, 
    1553572800, 1553714100, 1553714100, 1553774717.64706, 1553774717.64706, 
    1553857842.85714, 1553857842.85714, 1553942057.14286, 1553942057.14286, 
    1553995800, 1553995800, 1554210800, 1554210800, 1554313000, 
    1554313000, 1554383442.85714, 1554383442.85714, 1554463080, 
    1554463080, 1554551672.72727, 1554551672.72727, 1554640740, 
    1554640740, 1554723600, 1554723600, 1554809760, 1554809760, 
    1555006320, 1555006320, 1555067250, 1555067250, 1555150950, 
    1555150950, 1556319600, 1556319600, 1556373600, 1556373600, 
    1556453400, 1556453400, 1556533800, 1556533800, 1556646300, 
    1556646300, 1556707628.57143, 1556707628.57143, 1556797800, 
    1556797800, 1556888123.07692, 1556888123.07692, 1556974800, 
    1556974800, 1557050072.72727, 1557050072.72727, 1557869400, 
    1557869400, 1557914563.63636, 1557914563.63636, 1558005726.31579, 
    1558005726.31579, 1558092937.5, 1558092937.5, 1558178600, 
    1558178600, 1558265611.76471, 1558265611.76471, 1558351376.47059, 
    1558351376.47059, 1558436400, 1558436400, 1558525050, 1558525050, 
    1558612164.70588, 1558612164.70588, 1558699300, 1558699300, 
    1558783320, 1558783320, 1558874400, 1558874400, 1558935600, 
    1558935600, 1559079900, 1559079900, 1559128950, 1559128950, 
    1559216747.36842, 1559216747.36842, 1559301900, 1559301900, 
    1559387300, 1559387300, 1559474258.82353, 1559474258.82353, 
    1559561717.64706, 1559561717.64706, 1559649494.11765, 1559649494.11765, 
    1559733300, 1559733300, 1559816485.71429, 1559816485.71429, 
    1559908270.58824, 1559908270.58824, 1559994750, 1559994750, 
    1560075187.5, 1560075187.5, 1560612150, 1560612150, 1560686600, 
    1560686600, 1560744720, 1560744720, 1560897000, 1560897000, 
    1560945494.11765, 1560945494.11765, 1561031258.82353, 1561031258.82353, 
    1561124353.84615, 1561124353.84615, 1561174650, 1561174650, 
    1561397760, 1561397760, 1561469250, 1561469250, 1561509600, 
    1561509600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    conc_mean = c(2.21485, 4.51665, 1.07492666666667, 3.61554666666667, 
    1.2719875, 3.3012125, 0.765063157894737, 3.71997368421053, 
    0.375805263157895, 1.10004210526316, 0.675033333333333, 1.17912, 
    1.23057222222222, 3.79774444444444, 0.204633333333333, 0.578241666666667, 
    0.54028, 0.23396, 0.702907142857143, 0.971378571428571, 0.813372727272727, 
    1.31120909090909, 0.87175, 1.3416, 1.15376, 3.93216, 0.3061, 
    1.58768333333333, 0.325572727272727, 0.530245454545455, 0.735842857142857, 
    1.18681428571429, 0.489575, 0.8701375, 0.431847058823529, 
    0.618288235294118, 0.572268421052632, 1.00910526315789, 0.475021428571429, 
    1.11840714285714, 0.437810526315789, 0.73228947368421, 0.677941666666667, 
    1.26760833333333, 0.4298875, 0.667275, 0, 0.141375, 0.396471428571429, 
    0.566985714285714, 0.562175, 0.5603625, 0.415214285714286, 
    1.04814285714286, 0.139766666666667, 0.1184, 0.158435714285714, 
    0.493435714285714, 0.738375, 2.1870375, 0.5032125, 1.860325, 
    0, 0, 0.80184, 1.6749, 0.629425, 1.32535, 0.621492857142857, 
    2.09426428571429, 0.521784615384615, 0.8041, 0.0966, 0.02106, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.11013, 
    0.45911, 0.945981818181818, 2.15627272727273, 0.44487, 0.68837, 
    0.8569, 1.47154444444444, 0.40066, 0.88519, 0, 0, 0.278175, 
    0.1233125, 0.199175, 0.108025, 0.1002, 0.1679, 0.157933333333333, 
    0.303033333333333, 0.231433333333333, 0.330433333333333, 
    0.5878, 0.694266666666667, 1.13938333333333, 0.78425, 3.01142142857143, 
    0.8532, 2.96855333333333, 0.905413333333333, 2.63885384615385, 
    0.831161538461539, 0.0564933333333333, 0.110113333333333, 
    0.0251636363636364, 0.0381454545454545, 0.032775, 0.070375, 
    0.171754545454545, 0.179809090909091, 0.868431578947368, 
    0.290926315789474, 1.460875, 0.3505375, 0.515116666666667, 
    0.2017, 0.170970588235294, 0.0566647058823529, 2.00161764705882, 
    0.891194117647059, 2.27995882352941, 1.07888823529412, 0.4599, 
    0.172966666666667, 0.292129411764706, 0.3191, 1.30511111111111, 
    0.858427777777778, 0.90774, 0.82456, 0.538777777777778, 0.221883333333333, 
    0.509583333333333, 0.280516666666667, 0.24795, 0.14805, 0.08165, 
    0.09388125, 0.0355947368421053, 0.0266210526315789, 0.0540666666666667, 
    0.0445833333333333, 0.0329111111111111, 0.0137111111111111, 
    0.431323529411765, 0.138288235294118, 0.946082352941176, 
    0.597052941176471, 0.0175, 0.00785294117647059, 0.03314375, 
    0.019, 0.04485, 0.0101714285714286, 1.12921176470588, 0.166876470588235, 
    2.01030625, 1.2114875, 1.25706875, 0.54935, 0.0532833333333333, 
    0.05245, 0.0311222222222222, 0.00601666666666667, 0, 0, 0, 
    0, 0, 0, 0, 0, 0.168461538461538, 0.0720230769230769, 0, 
    0, 0.46362, 0.17162, 0.347108333333333, 0.1352, 0.255366666666667, 
    0.0637), conc_min = c(0.9481, 1.016, 0, 0, 0, 0, 0.1382, 
    0.4736, 0.1568, 0.2592, 0.1855, 0.1443, 0.3351, 0.4526, 0.0364, 
    0.0148, 0.3338, 0.0614, 0.1845, 0.193, 0.298, 0.2129, 0, 
    0, 0.182, 0.3781, 0.1973, 0.5151, 0, 0, 0.289, 0.0466, 0.076, 
    0.0312, 0.1458, 0.0806, 0.1124, 0.0219, 0.1038, 0.0628, 0, 
    0, 0, 0, 0, 0, 0, 0.0911, 0, 0, 0.3236, 0.0391, 0.0757, 0.0159, 
    0.0289, 0, 0.0117, 0.0052, 0.1448, 0.1749, 0, 0, 0, 0, 0, 
    0, 0.2611, 0.1329, 0.1001, 0.6807, 0.0311, 0.0042, 0.0149, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0.2353, 0.5611, 0.0524, 0.0392, 0.2764, 0.3357, 0, 0, 0, 
    0, 0, 0, 0, 0, 0.1002, 0.1679, 0.0878, 0.2908, 0, 0, 0.4953, 
    0.4679, 0.7842, 0.2518, 1.1497, 0.4129, 1.4005, 0.3776, 1.0426, 
    0.3828, 0.0077, 0.0047, 0, 0, 0.026, 0.0039, 0.0241, 0.0029, 
    0.0522, 0.0555, 0.1238, 0.0305, 0.025, 0.0009, 0.0211, 0.0007, 
    0.035, 0.0093, 0.2304, 0.1012, 0.0358, 0.0139, 0.0711, 0.0259, 
    0.2234, 0.1971, 0.012, 0, 0.0079, 0, 0, 0, 0.0348, 0.0258, 
    0.006, 0, 0.0055, 0, 0.0081, 0, 0.0109, 0, 0.0144, 0, 0.0276, 
    0.0015, 0.0047, 0, 0.007, 0, 0.0114, 0, 0.0062, 0, 0.2045, 
    0.3129, 0, 0, 0.0173, 0.0009, 0.0123, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0.1093, 0.0679, 0.0855, 0.0256, 0.0927, 
    0.0266), conc_max = c(5.2082, 9.4515, 2.6412, 9.5067, 3.374, 
    10.2935, 1.9887, 7.3334, 1.1261, 2.2172, 2.521, 2.9801, 3.3107, 
    7.9089, 0.701, 1.181, 0.9013, 0.7176, 1.3709, 2.6799, 2.4004, 
    2.6443, 1.7978, 3.5656, 2.2826, 9.0001, 0.4704, 3.1122, 1.1959, 
    1.0669, 1.8055, 2.8748, 1.4114, 2.7354, 0.9683, 1.6872, 1.7906, 
    3.068, 1.1533, 3.1572, 1.61, 1.8917, 3.1135, 3.3496, 0.8959, 
    1.6323, 0, 0.1973, 1.1029, 1.7997, 1.0299, 1.3705, 1.7949, 
    5.4322, 0.4341, 0.3075, 0.6009, 1.5614, 1.6237, 6.4092, 1.6444, 
    4.1521, 0, 0, 1.6438, 4.4297, 1.512, 2.4371, 2.0231, 6.2908, 
    1.5731, 2.59, 0.3182, 0.0694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0.5511, 2.499, 1.596, 3.4777, 1.018, 
    1.5773, 1.8561, 2.5637, 1.0436, 3.3362, 0, 0, 1.3413, 0.3713, 
    0.6086, 0.4185, 0.1002, 0.1679, 0.2585, 0.3129, 0.6006, 0.7198, 
    0.668, 1.1023, 1.8961, 1.2774, 6.3908, 1.2608, 5.7836, 1.9329, 
    4.8889, 2.1084, 0.4252, 0.5633, 0.0532, 0.1212, 0.0488, 0.262, 
    0.3876, 1.006, 3.4004, 1.1248, 4.1029, 1.2065, 2.13, 0.6134, 
    0.7077, 0.2737, 6.3182, 2.0403, 6.3883, 2.3115, 1.4964, 0.5299, 
    1.2378, 0.9909, 4.1648, 2.5412, 4.6703, 2.0224, 2.8942, 0.9106, 
    1.1358, 0.7632, 0.4456, 0.2783, 0.4417, 0.5307, 0.0934, 0.1239, 
    0.2766, 0.2853, 0.1005, 0.1172, 4.3601, 1.3379, 4.5632, 2.9013, 
    0.0615, 0.0915, 0.0648, 0.1201, 0.1214, 0.0886, 7.008, 1.001, 
    4.6935, 5.0903, 7.8913, 1.6407, 0.1217, 0.2257, 0.1106, 0.0603, 
    0, 0, 0, 0, 0, 0, 0, 0, 1.0643, 0.5233, 0, 0, 0.6608, 0.2956, 
    0.8226, 0.3397, 0.3421, 0.1225)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -202L))

這是另一個比我最初想象的稍微復雜的問題,但我認為我有一個似乎可行的解決方案。 乍一看,您似乎可以只設置data=stat_total[which(stat_total$conc_mean,=0),] ,這意味着只會繪制那些大於 0 的值......但這不起作用。 原因很簡單, ggplot仍將通過 geom_path 一直連接線並通過geom_path繪制功能geom_ribbon ,因為數據存在於這些 0 值的右側和左側。

這里的關鍵是要了解我們想要更改和分配group=審美。 這控制幾何圖形的連接性,如線條。 它很容易通過以下方式演示:

d <- data.frame(x=1:10, y=1:10, grp=c(rep(1,4),2,rep(3,5)))
ggplot(d, aes(x,y)) + theme_bw() + 
    geom_line(aes(group=grp)) + geom_point()

在此處輸入圖像描述

因此,您的示例的理論解決方案將涉及讓group=美學應用於不等於零的stat_total$conc_mean的“部分”,同時在stat_total$conc_mean等於零時也不進行繪圖。 至關重要的是,“部分”需要具有不同的group=審美價值。 如果他們不這樣做,那么我們將像您現在一樣將整個事物連接起來,因為再次 - 在這些零的右側和左側仍然存在數據,因此ggplot只會在它們之間畫一條線。

解決方案

首先,我按stat_total$gasstat_total$date_mean排列了您的數據框。

df <- arrange(stat_total, gas, date_mean)

然后,我想

(1)創建一個列,該列基本上指示stat_total$conc_mean為 0 或包含的值 > 0。我承認沒有這一步可能更優雅地完成目標,但這部分也使得更容易遵循解決方案.

df$a <- ifelse(df$conc_mean==0, NA, 1)

(2)使用 function 創建一個新的分組列。 function 遍歷一個向量並將一個計數( g_num )存儲到一個返回向量中,當有一個數字時 position ,但存儲NA並在找到NA時增加g_num 結果是一個返回向量,其中包含我們想要的數字序列。

my_func <- function(x) {
  g_num <- 1
  return_vect <- vector(mode='double',length=length(x))
  for(i in 1:length(x)) {
    if (is.na(x[i])){
      return_vect[i] <- NA
      g_num <- g_num+1
    }
    else {
      return_vect[i] <- g_num
    }
  }
  return(return_vect)
}

# create the new column
df$g <- my_func(df$a)

它是如何工作的一個例子如下所示:

> test <- c(1,1,1,NA,NA,1,1,NA,1,1)
> test
 [1]  1  1  1 NA NA  1  1 NA  1  1
> my_func(test)
 [1]  1  1  1 NA NA  3  3 NA  4  4

(3) Plot 它。 它與您的原始代碼相同,但我們使用新列作為group=美學,並且只有 plot 值 > 0 用於stat_total$conc_mean (因此您避免在某些部分的圖表底部出現一條線。

ggplot(df[which(df$conc_mean!=0),], aes(color=gas, group=g)) + 
  geom_path(aes(x=date_mean, y=conc_mean, color=gas), size=1.2, na.rm = T) +          
  geom_ribbon(aes(x=date_mean, ymin=conc_min, ymax=conc_max, fill=gas), color="grey70", alpha=0.4, na.rm = T)+
  scale_x_datetime(date_breaks = "3 weeks" , date_labels = "%d-%b") + 
  xlab(NULL) +
  ylab('[ppb]') + 
  theme_bw() +
  facet_wrap(gas~.,scales = 'free_x',ncol = 1,nrow=2)

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM