【问题标题】:How to unclutter the x-axis in a plot如何整理绘图中的 x 轴
【发布时间】:2021-03-26 14:24:54
【问题描述】:

使用 R 编程语言,我创建了一些时间序列数据(每日测量,超过 20 年)。我在每个月的时间段汇总了这些数据,然后生成了一个图表:

library(ggplot2)

library(xts)

library(scales)

set.seed(123)

day = seq(as.Date("2000/1/1"), as.Date("2020/1/1"),by="day")

day <- format(as.Date(day), "%Y/%m/%d")

amount <- rnorm(7306 ,100,10)

data <- data.frame(day, amount)

y.mon<-aggregate(amount~format(as.Date(day),
format="%Y/%m"),data=data, FUN=sum)

y.mon$d = y.mon$`format(as.Date(day), format = "%Y/%m")`

ggplot(y.mon, aes(x = d, y=amount))+
         geom_line(aes(group=1))

  1. 现在,x 轴完全不可读。有没有办法“整理”x轴?也许“倾斜”日期或每隔 4 个月显示日期?我可以完全删除 x 轴,但理想情况下我想保留它以供参考。

  2. 在图表的末端,有一个巨大的向下“尖峰”。我认为这是因为数据每个月都会汇总 - 并且由于数据可用的最后一天是“2020 年 1 月 1 日”,这会导致“向下峰值”。是否可以“查询”“y.mon”对象,以便仅在最后一个“完成”时间段之前制作图表?这个“尖峰”是骗人的,有人可能会看到图表并认为 2020 年 1 月发生了大异常,但实际上是因为此时只有 1 个测量值。

谢谢

【问题讨论】:

  • 看来d 是一个离散变量。保留as.Date() 并在+ scale_x_date(date_labels = ...) 中更改格式
  • 你的意思是:y.mon$d =as.Date (y.mon$d) 吗?
  • 我之前试过这个并得到以下结果: y.mon$d =as.Date(y.mon$d) charToDate(x) 中的错误:字符串不是标准的明确格式

标签: r ggplot2 time-series aggregate data-visualization


【解决方案1】:

你也可以试试:

library(ggplot2)
library(xts)
library(scales)
set.seed(123)
#Data
day = seq(as.Date("2000/1/1"), as.Date("2020/1/1"),by="day")
amount <- rnorm(7306 ,100,10)
data <- data.frame(day, amount)
#Aggregate
y.mon<-aggregate(amount~format(as.Date(day),
                               format="%Y/%m"),data=data, FUN=sum)
#Count days
y.mon2<-aggregate(amount~format(as.Date(day),
                               format="%Y/%m"),data=data,
                  FUN=function(x) length(x))
names(y.mon2)[2]<-'N'
#Format and merge to add N
y.mon$d = y.mon$`format(as.Date(day), format = "%Y/%m")`
mmon <- merge(y.mon,y.mon2)
#Add a dummy date
mmon$d <- as.Date(paste0(mmon$d,'/01'),'%Y/%m/%d')
#Plot
ggplot(subset(mmon,N!=1), aes(x = d, y=amount))+
  geom_line(aes(group=1))+
  scale_x_date(date_breaks = '4 month',date_labels = '%Y-%m',
               expand = c(0,0))+
  theme(axis.text.x = element_text(angle = 90))

输出:

更新:使用以前的代码,只更改标签:

#Plot Update
ggplot(subset(mmon,N!=1), aes(x = d, y=amount))+
  geom_line(aes(group=1))+
  scale_x_date(date_breaks = '12 month',date_labels = '%Y',
               expand = c(0,0))+
  theme(axis.text.x = element_text(angle = 90))

输出:

【讨论】:

  • 感谢您的回答!我真的很喜欢你之前的回答:stackoverflow.com/questions/65162036/…(第二张图)。您能否告诉我如何为我的图表执行此操作(每年只在 x 轴上显示一个“勾号”,或者每两年只显示一个“勾号”)?谢谢你的一切!
  • @Noob 当然让我更新,关键是日期休息!
  • @Noob 我已经更新了代码,如果这对你有用,请告诉我!
  • 这是完美的,谢谢!只是为了将来,您如何修改此代码以不同地标记 x 轴?假设我想一年两次(每 6 个月)做一次“滴答”,这将如何工作?我不确定,但你会写:ggplot(subset(mmon,N!=1), aes(x = d, y=amount))+ geom_line(aes(group=1))+ scale_x_date(date_breaks = '6 month',date_labels = '%Y', expand = c(0,0))+ theme(axis.text.x = element_text(angle = 90)) ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多