r - 如何在 R 中 ggplot2 的时间序列图中自定义离散时间步并将其添加到 x 轴?
问题描述
我正在努力在 ggplot 的 x 轴上获取日期字段。我正在使用的数据是来自两个不同传感器的气溶胶浓度的时间序列数据。时间序列中的日期字段不是连续的。相反,它包含从 2007 年到 2016 年一年中仅三个月的每日观察,即 3 月、4 月和 5 月。因此,当我将数据框中的日期列分配为“日期”字段时,它显示了这一点图中我不喜欢的链接。 ggplot 输出。但是,如果没有将日期列指定为“日期”,它会显示这个数字。 ggplot输出2. 这个新图形的问题是 x 轴文本的不可读性。我想,这背后的原因是 - 日期字段已被读取为因子变量。通过对代码进行一些修改,我可以删除 x 轴刻度和轴文本。现在我希望将数据框中的原始日期放在 x 轴上,并有合理的休息时间。我正在分享我使用过的代码和数据子集。
library(ggplot2)
library(reshape2)
df = read.csv('./mydata.csv')
names(df) = c('Date','MODIS','MISR')
df_melt = melt(df, id.vars = 'Date')
head(df_melt)
names(df_melt) = c('Date','grp','AOD')
ggplot(df_melt, aes(x = Date, y = AOD, group = 1, colour = grp))+
theme(axis.text.x = element_blank()
,axis.ticks.x = element_blank())+
geom_line()+
facet_wrap(~ grp, ncol = 1)
解决方案
这确实是一个有点痛苦的计算。我的建议是使用游程编码来查找年/月的第一次出现并将其用作轴中断。
# Loading your data
df <- read.csv(file.choose())
df <- setNames(df, c("Date", "MODIS", "MISR"))
# Convert dates to ordered factors (totally assumes dates are in correct order)
df$Date <- ordered(as.character(df$Date), levels = as.character(df$Date))
# Find appropriate breaks
char_date <- as.character(df$Date)
nch <- nchar(char_date)
## Find which factor level is the first of a new year
years <- rle(substr(char_date, nch - 3, nch))
year_breaks <- cumsum(years$lengths) - years$lengths + 1
## Find which factor level is the first day of a new month
months <- rle(substr(char_date, 4, 5))
month_breaks <- cumsum(months$lengths) - months$lengths + 1
# Melt data
df_melt <- reshape2::melt(df, id.vars = 'Date')
names(df_melt) = c('Date','grp','AOD')
# Use date as numeric
ggplot(df_melt, aes(x = as.numeric(Date), y = AOD, group = 1, colour = grp))+
geom_line()+
scale_x_continuous(breaks = year_breaks, labels = years$values,
minor_breaks = month_breaks) +
facet_wrap(~ grp, ncol = 1)
推荐阅读
- android - ARCore - 在平面上显示 3D 模型
- python - 如何在另一个函数中使用另一个函数中的函数中的变量
- python - Pyhook 等到 keyup
- azure - 使用守护程序/控制台应用程序调用 Azure AD 保护自己的 Web API n 具有特定范围
- tensorflow - 调试 tf.data.Dataset.map
- ember.js - ember 中带有查询参数的链接
- r - 在 gglot2 中使用 SVG 图像作为符号
- elasticsearch - ElasticSearch - 比较两个时间段内的不同值
- assembly - 如果操作数超过 127,CMP 指令表现异常?
- javascript - 如果复选框为真并且没有在angular8中添加日期,如何抛出错误