将geom_area中的区域调整为geom_line中的一条线

时间:2019-08-06 02:16:07

标签: r ggplot2

我正在尝试用发电量和能源消耗数据绘制每小时调度曲线,其特征是当我们进行功率平衡(发电量减去消耗量)时,我们得到的值几乎为零。
在发电数据中,也有净交换值,当电力系统输出能量时为负,当系统输入能量以完成消耗时为正。
enter image description here  因此,对于用geom_areageom_line创建的绘图来说,可以确定黑线(消耗量)是否随生成区域进行调整,以使该区域与黑线之间没有间隙。但是,在我的尝试中,我做不到。可以看到,相同的能量平衡导致零,在beetwen 19和20小时之间还有一个间隔。我不知道怎么了有人知道怎么做吗?
预先感谢。

绘图数据:
generation <-
  data.frame('dayHour' = c('18/11/2018 18:00','18/11/2018 19:00','18/11/2018 20:00','18/11/2018 21:00','18/11/2018 18:00','18/11/2018 19:00','18/11/2018 20:00','18/11/2018 21:00','18/11/2018 18:00','18/11/2018 19:00','18/11/2018 20:00','18/11/2018 21:00','18/11/2018 18:00','18/11/2018 19:00','18/11/2018 20:00','18/11/2018 21:00'),
             'power' = c(-1364.290, -433.110, 1132.39, 749.48, 463.75, 467.8, 469.35, 436.51, 2025.5, 2133.07, 2306.85, 2304.91, 211.52, 213.16, 214.33, 214.59),
             'label' = c('net interchange', 'net interchange', 'net interchange', 'net interchange', 'gas', 'gas', 'gas', 'gas', 'hydro', 'hydro', 'hydro', 'hydro', 'biomass', 'biomass', 'biomass', 'biomass'))


generation$label <- factor(generation$label, levels = c('net interchange', 'gas', 'hydro', 'biomass'))

net.load <- 
  data.frame('dayHour' = c('18/11/2018 18:00', '18/11/2018 19:00', '18/11/2018 20:00', '18/11/2018 21:00'), 'power' = c(1336.48, 2380.91, 4122.91, 3705.49), 'label' = c('net load', 'net load', 'net load', 'net load'))


generation$dayHour <-
  as.POSIXct(strptime(generation$dayHour,format='%d/%m/%Y %H:%M'))

net.load$dayHour <- 
  as.POSIXct(strptime(net.load$dayHour,format='%d/%m/%Y %H:%M'))
功率平衡
pb <- 
filter(generation, label == "biomass")$power +
filter(generation, label == "hydro")$power +
filter(generation, label == "gas")$power +
filter(generation, label == "net interchange")$power -
net.load$power

summary(pb)
调度曲线
ggplot() + 

  geom_area(data = generation,
            aes(y = power,
                x = dayHour,
                fill = label)) + 

  geom_line(data = net.load,
            aes(y = power,
                x = dayHour,
                colour = label),
            size = 1.2,
            colour = "black")  +

      labs(fill = "generation",
         colour = 'net load')

1 个答案:

答案 0 :(得分:4)

当插值穿过x轴时,position_stack似乎变得困惑。

要解决此问题,您可以在绘制之前手动进行插值(例如使用approx):

library(tidyverse)

generation <- data.frame(
    dayHour = structure(c(1542585600, 1542589200, 1542592800, 1542596400, 1542585600, 1542589200, 1542592800, 1542596400, 1542585600, 1542589200, 1542592800, 1542596400, 1542585600, 1542589200, 1542592800, 1542596400), class = c("POSIXct", "POSIXt"), tzone = ""),
    power = c(-1364.29, -433.11, 1132.39, 749.48, 463.75, 467.8, 469.35, 436.51, 2025.5, 2133.07, 2306.85, 2304.91, 211.52, 213.16, 214.33, 214.59),
    label = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("net interchange", "gas", "hydro", "biomass"), class = "factor")
)

generation_interpolated <- generation %>% 
    group_by(label) %>% 
    summarise(data = list(as_tibble(approx(dayHour, power, n = 501)))) %>% 
    unnest() %>% 
    mutate(x = as.POSIXct(x, origin = '1970-01-01', tz = 'UTC')) 

net_power_interpolated <- generation_interpolated %>% 
    group_by(x) %>% 
    summarise(y = sum(y))

ggplot(generation_interpolated, aes(x, y)) + 
    geom_area(aes(fill = label)) + 
    geom_line(data = net_power_interpolated)

line that fits areas

要查看approx的工作方式,请使用一个更简单的,未分组的示例:

df <- data.frame(x = c(0, 5, 10), y = c(0, 20, 10))
interpolated <- approx(df$x, df$y, n = 11)
str(interpolated)
#> List of 2
#>  $ x: int [1:11] 0 1 2 3 4 5 6 7 8 9 ...
#>  $ y: num [1:11] 0 4 8 12 16 20 18 16 14 12 ...

ggplot(as.data.frame(interpolated), aes(x, y)) + 
    geom_line() + 
    geom_point() + 
    geom_point(data = df, color = 'dodgerblue', size = 4)