You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot叠加geom_raster与geom_point绘图异常,请求排查修正

问题解决:ggplot绘制栅图叠加散点的错误修正

问题描述

现有如下数据集:

structure(list(Datetime = structure(c(1604188800, 1604192400, 
1604196000, 1604199600, 1604203200, 1604206800, 1604210400, 1604214000, 
1604217600, 1604221200, 1604224800, 1604228400, 1604232000, 1604235600, 
1604239200, 1604242800, 1604246400, 1604250000, 1604253600, 1604257200, 
1604260800, 1604264400, 1604268000, 1604271600, 1604275200, 1604278800, 
1604282400, 1604286000, 1604289600, 1604293200), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), amb_var = c(NA, NA, NA, 1.0014694795, 0.983929716666667, 
0.955620169666667, 0.989994305166667, 0.949170644666667, 1.02736884383333, 
1.0634456996, 0.757796259, 0.964273832833333, 1.0010119495, 0.8585854745, 
1.011050308, 1.13641933433333, 1.111877249, 1.09221488333333, 
1.07883340533333, 1.109587318, 1.0872007085, 1.0272168345, 1.10487714875, 
1.04610194266667, 1.02695567333333, 1.051095495, NA, 1.09990141116667, 
1.00926073433333, 1.00053694283333), date_ = structure(c(1604188800, 
1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 
1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 
1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 
1604188800, 1604188800, 1604188800, 1604188800, 1604188800, 1604275200, 
1604275200, 1604275200, 1604275200, 1604275200, 1604275200), tzone = "", class = c("POSIXct", 
"POSIXt")), time_ = structure(c(0, 3600, 7200, 10800, 14400, 
18000, 21600, 25200, 28800, 32400, 36000, 39600, 43200, 46800, 
50400, 54000, 57600, 61200, 64800, 68400, 72000, 75600, 79200, 
82800, 0, 3600, 7200, 10800, 14400, 18000), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), bio_var = c(NA_integer_, NA_integer_, 10, 
5, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, 1, 1, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
NA_integer_, 5, 1, NA_integer_, NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, 2, 2, 
NA_integer_, NA_integer_)), row.names = c(NA, -30L), class = c("tbl_df", 
"tbl", "data.frame"))

需要用ggplot的geom_raster展示非生物变量amb_var,叠加geom_point展示生物变量bio_var,但运行以下代码时出错:

lims2 <- as.Date(c("2020-11-01","2022-06-10"))
ggplot() + 
  geom_raster(data = df, aes(x = date_, y = time_, fill = amb_var), interpolate = T) +
  scale_fill_gradientn(colours = c("lightblue","yellow", "red")) + 
  geom_point(data = df, aes(x = time_, y = date_, size = bio_var)) +
  scale_y_datetime(date_breaks = "3 hours", date_labels = "%H:%M") +
  scale_x_datetime(date_labels = "%m-%Y", breaks = "2 months", 
                   limits = as.POSIXct(lims2)) +
  labs(y = "HORA", x = "DATA", fill = "Variable") +
  theme_test() +
  theme(axis.text.x = element_text(size = 20, angle = 45,
                                   vjust = 1, hjust = 1,
                                   color = "black", face = "bold"),
        axis.text.y = element_text(size = 20,
                                   color = "black", face = "bold"), 
        axis.title.x = element_text(size = 20,
                                    color = "black", face = "bold"), 
        axis.title.y = element_text(size = 20,
                                    color = "black", face = "bold"),
        legend.text = element_text(size = 20, face = "bold"),
        legend.title = element_text(size = 20, face = "bold"),
        plot.title = element_text(size = 20, face = "bold"))

错误分析

  1. 坐标轴映射颠倒:geom_point中x和y的映射和geom_raster相反,导致散点位置完全错误。
  2. time_格式问题:time_是基于1970-01-01的POSIXct值,直接用作y轴会导致显示的日期不对,应该提取时间部分(小时/分钟)作为连续值或时间类变量。
  3. x轴范围不合理:数据集仅包含2020-11-01和2020-11-02两天的数据,但x轴范围设置到2022年,会导致图表大部分区域空白。
  4. NA值未处理:bio_var包含大量NA值,绘制散点时会出现警告,且无效点会占用资源。

修正后的代码

# 加载必要包
library(ggplot2)
library(lubridate)

# 转换time_为小时数(更适合作为y轴连续变量)
df$time_hour <- hour(df$time_) + minute(df$time_)/60

# 修正ggplot代码
ggplot() + 
  # 栅图图层:保持x=date_,y用转换后的time_hour
  geom_raster(data = df, aes(x = date_, y = time_hour, fill = amb_var), interpolate = TRUE) +
  scale_fill_gradientn(colours = c("lightblue","yellow", "red"), na.value = "white") + 
  # 散点图层:修正x/y映射,过滤NA值
  geom_point(data = subset(df, !is.na(bio_var)), aes(x = date_, y = time_hour, size = bio_var), 
             color = "black", alpha = 0.8) +
  # x轴:匹配数据集的实际日期范围
  scale_x_datetime(date_labels = "%Y-%m-%d", breaks = "1 day",
                   limits = as.POSIXct(c("2020-11-01", "2020-11-03"))) +
  # y轴:用小时数设置刻度,显示为时间格式
  scale_y_continuous(breaks = seq(0, 24, 3), labels = sprintf("%02d:00", seq(0,24,3))) +
  labs(y = "HORA", x = "DATA", fill = "Variable", size = "Bio Variable") +
  theme_test() +
  theme(axis.text.x = element_text(size = 12, angle = 45,
                                   vjust = 1, hjust = 1,
                                   color = "black", face = "bold"),
        axis.text.y = element_text(size = 12,
                                   color = "black", face = "bold"), 
        axis.title.x = element_text(size = 14,
                                    color = "black", face = "bold"), 
        axis.title.y = element_text(size = 14,
                                    color = "black", face = "bold"),
        legend.text = element_text(size = 12, face = "bold"),
        legend.title = element_text(size = 14, face = "bold"))

关键修正点说明

  • 将time_转换为小时数(time_hour),避免POSIXct日期的干扰,同时保持时间的连续性。
  • 统一geom_raster和geom_point的x/y映射,确保散点准确叠加在栅图对应位置。
  • 设置scale_fill_gradientn的na.value = "white",让NA值区域显示为白色,更清晰。
  • 过滤bio_var的NA值,减少警告并提升绘图效率。
  • 调整x轴范围为数据集实际包含的日期,避免空白区域。
  • 将y轴改为连续型变量,用自定义标签显示时间格式,解决原POSIXct时间轴的显示问题。

内容的提问来源于stack exchange,提问作者Wilson Souza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:24:56