R语言 在ggplot中反转日期时间(POSIXct数据)轴

bakd9h0s  于 2023-09-27  发布在  其他
关注(0)|答案(3)|浏览(95)

我正试图使用ggplot创建一个POSIXct时间的图,并希望反转轴,但我很难使其工作。我一直在使用scale_y_datetime,因为在我的真实的应用程序中,控制这个轴上的断点很重要。
这里有一个我的问题的例子,首先是正常的排序,然后我试图扭转轴。

# Some random dates and values to plot
MyData <-
  structure(list(Date = structure(c(1492979809.99827, 1492602845.68722, 
  1493093428.90318, 1492605578.0691, 1492961342.65056, 1492771976.83545, 
  1493020588.88485, 1493057018.85104, 1492852011.23873, 1492855996.55059
  ), class = c("POSIXct", "POSIXt")), Value = c(4.52885504579172, 
  6.0024610790424, 8.96430060034618, 7.06435370026156, 5.08460514713079, 
  3.47828012891114, 6.29844291834161, 0.898315710946918, 1.44857675535604, 
  5.74641009094194)), .Names = c("Date", "Value"), row.names = c(NA, 
  -10L), class = "data.frame")

library(ggplot2)
library(scales)
ggplot(MyData, aes(x=Value, y=Date)) +
  geom_point() + 
  scale_y_datetime(limits=c(min(MyData$Date),max(MyData$Date)))

它产生了这个:

如果我试图通过反转限制来反转Y轴,我会丢失所有断点和数据,如下所示:

ggplot(MyData, aes(x=Value, y=Date)) +
  geom_point() +
  scale_y_datetime(limits=c(max(MyData$Date),min(MyData$Date)))

有没有简单的方法来反转日期时间轴?

lfapxunr

lfapxunr1#

在Hadley威克姆的这篇文章的帮助下,你可以得到一个反向的日期时间尺度:

library(scales)
c_trans <- function(a, b, breaks = b$breaks, format = b$format) {
  a <- as.trans(a)
  b <- as.trans(b)
  
  name <- paste(a$name, b$name, sep = "-")
  
  trans <- function(x) a$trans(b$trans(x))
  inv <- function(x) b$inverse(a$inverse(x))
  
  trans_new(name, trans, inverse = inv, breaks = breaks, format=format)

}

rev_date <- c_trans("reverse", "time")

ggplot(MyData, aes(x=Value, y=Date)) +
  geom_point() + 
  scale_y_continuous(trans = rev_date)

以下是情节:

nkoocmlb

nkoocmlb2#

已接受的答案不再适用于我(R版本4.2.1)。解决这个问题的一个方法是稍微修改tidyquant包中的函数coord_x_datetime,以反转y轴的日期时间。下面是一个叫做coord_y_datetime的函数:

coord_y_datetime <- function(xlim = NULL, ylim = NULL, expand = TRUE) {
  if (!is.null(ylim)) {
    ylim <- lubridate::as_datetime(ylim)
  }
  ggplot2::coord_cartesian(xlim = xlim, ylim = ylim, expand = expand)
}

下面是一个可重复的示例:

library(ggplot2)
ggplot(MyData, aes(x = Value, y = Date)) +
  geom_point() + 
  coord_y_datetime(ylim = c(max(MyData$Date), min(MyData$Date)))

创建于2022-11-14带有reprex v2.0.2
正如您所看到的,y轴的日期时间现在是颠倒的。

bvn4nwqk

bvn4nwqk3#

解决这个问题的一个方法是使用rev()。;)
在你的情况下...

ggplot(MyData, aes(x=Value, y=rev(Date))) +
  geom_point()

相关问题