在R中绘制GHI小时热力图遇异常,请求技术支持
问题排查与修正方案
原代码核心问题
- 语法错误:最后一行
theme(panel.grid=element_blank())前缺失连接符+,导致ggplot对象构建失败。 - 分面逻辑不符预期:
facet_grid(year~month)针对单一年份数据会生成1行12列的布局,和目标示例的分面样式不匹配。 - 月份赋值冲突:原代码先赋值
month <- data$month,随后用儒略日重新计算覆盖原值,若原数据month字段正确则无需此操作。 - X轴刻度不合理:固定设置
breaks =c(1,10,20,31),但部分月份无31天,会显示无效刻度。 - 依赖包未显式加载:使用
lubridate的hm和hour函数但未加载包,可能导致函数未找到报错。
修正后的完整代码
# 加载必需依赖包 library(ggplot2) library(lubridate) library(viridis) # 数据预处理(假设data已正确读取) day <- data$Day time <- hm(data$Time) hour <- hour(time) year <- 2023 # 若原数据month字段正确,直接使用;否则保留儒略日计算逻辑 # month <- data$month month <- month(as.Date(paste0("2000-", day), format = "%Y-%j")) GHI <- data$GHI # 规范变量名,避免与内置函数冲突 heatmap_df <- data.frame(GHI, year, month, day, hour) heatmap_GHI <- ggplot(heatmap_df, aes(x = day, y = hour, fill = GHI)) + geom_tile(color = "white", size = 0.1) + scale_fill_viridis(name = "GHI", option = "C") + # 改用facet_wrap实现目标分面布局,将月份数字转为名称 facet_wrap(~month, ncol = 3, labeller = labeller(month = month.name)) + scale_y_continuous(trans = "reverse", breaks = unique(heatmap_df$hour)) + # 调整X轴刻度适配所有月份 scale_x_continuous(breaks = c(1, 10, 20, 30)) + theme_minimal(base_size = 8) + labs(title = "Hourly GHI values", x = "Day", y = "Hour Commencing") + theme(legend.position = "bottom") + theme(plot.title = element_text(size = 14, hjust = 0)) + theme(axis.text.y = element_text(size = 6)) + theme(strip.background = element_rect(colour = "white")) + theme(axis.ticks = element_blank()) + theme(axis.text = element_text(size = 7)) + theme(legend.title = element_text(size = 8)) + theme(legend.text = element_text(size = 6)) + # 补全缺失的连接符+ theme(panel.grid = element_blank()) # 输出绘图 print(heatmap_GHI)
关键调整说明
- 修复语法错误:补全最后一个
theme前的+,确保ggplot图层正确串联。 - 优化分面布局:用
facet_wrap(~month, ncol=3)生成3列4行的分面,匹配目标示例样式,同时通过labeller参数将月份数字转为英文名称提升可读性。 - 调整X轴刻度:将刻度改为
c(1,10,20,30),避免显示不存在的日期。 - 规范变量命名:将
heatmap改为heatmap_df,避免与R内置heatmap()函数冲突。 - 显式加载依赖包:开头明确加载所需包,避免函数未找到的报错。
内容的提问来源于stack exchange,提问作者Jawairia
相关产品推荐
相关产品推荐

