如何在ggplot中叠加燃气与电力用量柱状图和价格折线图
堆叠柱状图+双折线图合并绘制方案
我有一个名为cost的DataFrame,包含日期、燃气(Gas)、电力(Electricity)的用量(usage)及对应价格(price)数据。需要绘制堆叠柱状图展示两类能源的用量占比,同时叠加两条折线展示二者同期价格。目前已分别完成柱状图和折线图的绘制,但无法合并,求可行方案。
数据片段
structure(list(Date = structure(c(18686, 18686, 18714, 18714, 18745, 18745), class = "Date"), Utility = c("Gas", "Electricity", "Gas", "Electricity", "Gas", "Electricity"), usage = c(0, 0, 125, 208, 104, 232), price = c(0, 0, 45.46, 37.82, 39.67, 43.09 )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" ))
原有单独绘图代码
- 堆叠柱状图:
ggplot(cost) + aes(x = Date, fill = Utility, weight = usage) + geom_bar() + scale_fill_hue(direction = 1) + theme_minimal()
- 价格折线图:
ggplot(cost) + aes(x = Date, y = price, colour = Utility) + geom_line(size = 0.5) + scale_color_manual( values = c(Electricity = "#8E0152", Gas = "#276419") ) + theme_minimal()
合并解决方案
由于用量(usage)和价格(price)是量级完全不同的指标,需使用双y轴合并图表。核心思路:以堆叠柱状图为主图(对应左y轴),在同一画布添加折线图并绑定右y轴,同时统一颜色映射保证图例一致性。
完整合并代码
library(ggplot2) # 定义统一颜色映射,确保柱状图与折线图颜色对应 color_map <- c(Electricity = "#8E0152", Gas = "#276419") ggplot(cost) + # 绘制堆叠柱状图:对应左y轴(能源用量) aes(x = Date) + geom_bar(aes(fill = Utility, weight = usage), position = "stack") + # 绘制价格折线图:绑定右y轴,指定group确保分能源连线 geom_line(aes(y = price, color = Utility, group = Utility), size = 0.5) + # 配置双y轴标签 scale_y_continuous( name = "能源用量", sec.axis = sec_axis(~., name = "能源价格") ) + # 统一颜色映射,自动合并图例 scale_fill_manual(values = color_map) + scale_color_manual(values = color_map) + # 主题与标签优化 theme_minimal() + labs(x = "日期", fill = "能源类型", color = "能源类型")
关键细节说明
sec.axis = sec_axis(~., name = "能源价格"):创建第二个y轴,用于展示价格数据;group = Utility:折线图需明确分组,避免同一日期的两个数据点连线错误;- 统一
scale_fill_manual和scale_color_manual的颜色映射:让同一能源的柱状图和折线图颜色一致,图例自动合并; position = "stack":显式指定柱状图为堆叠模式(默认也是堆叠,显式书写更清晰)。
内容的提问来源于stack exchange,提问作者User15Vim
相关产品推荐
相关产品推荐

