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

ggplot2可视化:X轴30分钟刻度及facet_grid时间显示问题求助

ggplot2时间序列可视化问题解决方案

问题1:X轴30分钟间隔未生效

原因

  • 时间解析时区错误:原数据start_time包含+0100时区偏移,手动指定tz="UTC"转换会导致时间偏差,影响刻度计算。
  • 跨天刻度重叠:4天数据直接显示%H:%M会导致不同日期的同一时间刻度重复,ggplot自动合并重复刻度,导致间隔显示异常。

问题2:facet_grid后X轴刻度不显示

原因

  • 默认facet_grid仅在底部面板显示X轴刻度,多面板场景下易被自动隐藏。
  • 轴文本未做角度/对齐调整,过长的刻度文本会被截断或挤压隐藏。

修正后的完整代码

library(readr)
library(ggplot2)
library(dplyr)
library(lubridate)

# 读取并清理数据
data <- read_csv("Energy readings - 25th May to 22nd June - Group 1 .csv")

# 正确解析带时区的时间,提取日期作为分面变量
data <- data %>%
  mutate(
    start_time = ymd_hms(start_time), # 自动识别时区偏移,避免格式错误
    date = as.Date(start_time)
  )

# 生成可视化图表
ggplot(data, aes(x = start_time, y = deviceId, fill = energy_use_wh)) +
  geom_tile() +
  scale_fill_gradient(low = "white", high = "blue") +
  labs(
    title = "Energy Use Over Time",
    x = "Start Time",
    y = "Device ID",
    fill = "Energy Use (Wh)"
  ) +
  # 强制X轴30分钟间隔,仅显示小时分钟
  scale_x_datetime(
    date_breaks = "30 minutes",
    date_labels = "%H:%M",
    expand = c(0, 0) # 消除轴两端空白,确保刻度完整显示
  ) +
  # 按日期分面,每个面板独立显示当天时间
  facet_grid(~date, scales = "free_x", space = "free_x") +
  theme_minimal() +
  # 调整轴文本样式,确保刻度可见
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 8),
    strip.text.x = element_text(size = 10, face = "bold"),
    plot.title = element_text(hjust = 0.5)
  )

关键修正说明

  1. 时间解析优化:用ymd_hms()自动识别带时区的时间字符串,取代手动指定格式,避免时区转换错误。
  2. 分面逻辑调整:新增date列按日期分面,每个面板仅显示当天的30分钟刻度,彻底解决跨天刻度重叠问题。
  3. X轴刻度强制:date_breaks = "30 minutes"固定间隔,expand = c(0,0)确保刻度从数据起始时间开始,无多余空白。
  4. 主题样式调整:通过axis.text.x设置文本角度和对齐,强制显示所有面板的X轴刻度,避免被隐藏或截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:24:56