r - 将 geom_area 中的区域调整为 geom_line 中的一条线
问题描述
我正在尝试使用发电和能源消耗数据制作每小时调度曲线,其特点是当我们进行功率平衡(发电减去消耗)时,我们得到的值几乎为零。
在发电数据中还有净交换值,当电力系统输出能量时为负值,当系统输入能量以完成消耗时为正值。因此,对于使用和
创建的情节geom_area
geom_line
没关系,黑线(消耗)需要与生成区域一起调整,使区域与黑线之间没有间隙。但是,在我的尝试中,我做不到。你怎么看,同样的能量平衡导致零,在 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')
解决方案
position_stack
当插值穿过 x 轴时,它看起来会变得混乱。
要修复它,您可以在绘图之前手动插值(例如使用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)
要查看其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)
推荐阅读
- mocking - SoapUI 模拟响应 - 响应时间
- c# - 想从我的 IIS 读取/写入网络上的文件但访问被拒绝
- javascript - 列表展开时可嵌套2展开按钮不隐藏
- c++ - 在使用聚合初始化时,是否可以在地图中进行无副本 emplace?
- osgi - 如何使用 GoGo Shell 更改 OSGi 中的默认命令范围并为自定义命令强制执行自定义范围?
- asp.net-mvc - 在单个 IIS 服务器上部署两个使用 Azure AD 进行身份验证的应用程序时,身份验证页面不断循环
- java - 错误:程序类型已存在:com.google.firebase.iid.FirebaseInstanceId
- jquery - 将样式应用于 kendoui listview 选定项目
- jmeter - 如何从不同线程中的jmeter全局属性中获取地图
- asp.net - Oracle 连接在 asp.net 中不起作用