将scale_color_gradient2与日期类的变量一起使用

时间:2019-02-14 22:03:36

标签: r date ggplot2 colors tidyverse

我正在尝试使用ggplot2按日期对颜色进行着色,但是当我尝试使用scale_color_gradient2自定义颜色时,出现错误提示Error in as.Date.numeric(value) : 'origin' must be supplied

我似乎无法弄清楚如何将原点传递给scale_color_gradient2

我在下面提供了一个示例。有什么建议吗?

set.seed(1)
x1 <- rnorm(100)
x2 <- rnorm(100)
day <- sample(seq(as.Date('1999/01/01'), as.Date('2000/01/01'), by="day"), 100)

myData <- data.frame(x1, x2, day)

# this plot works as expected
ggplot(myData, aes(x = x1, y = x2, color = day)) + geom_point()

# scale_color_gradient2() asks for an origin, but I can't figure out how to supply one
ggplot(myData, aes(x = x1, y = x2, color = day)) + geom_point() +
    scale_color_gradient2()

1 个答案:

答案 0 :(得分:5)

需要向scale_color_gradient2添加两件事:trans = "date" *和一个明智的midpoint(默认值为0)。我使用了mean'day'。请注意,您需要scale中的均值的数字版本:

ggplot(myData, aes(x = x1, y = x2, color = day)) +
  geom_point() +
  scale_color_gradient2(trans = "date", midpoint = as.numeric(mean(myData$day)))

enter image description here


您可能想更改图例中的默认中断和标签。首先,使用seqpretty创建一个中断序列:

brk <- seq.Date(min(myData$day), max(myData$day), by = "3 month")
# brk <- pretty(myData$day)

在您的比例尺中将breakslabels设置为所需的format

scale_color_gradient2(trans = "date", midpoint = as.numeric(mean(myData$day)), 
                      breaks = brk,
                      labels = format(brk, "%Y-%m")) 

编辑以下评论:

scale_color_gradient2POSIXct变量一起使用

trans = "time"上添加midpoint和一个明智的scale_color_gradient2。在这里,我指的是“时间”。请注意,您需要scale中均值的数字版本。

# some data
d <- data.frame(x = 1:10, y = 1, time = as.POSIXct("2019-02-15 12:00") + 1:10)

ggplot(d, aes(x = x, y = y, color = time)) +
  geom_point() +
  scale_color_gradient2(trans = "time", midpoint = as.numeric(mean(d$time)))

enter image description here


可能会更改图例中的中断和标签,例如

brk <- pretty(d$time)

ggplot(d, aes(x = x, y = y, color = time)) +
  geom_point() +
  scale_color_gradient2(trans = "time", midpoint = as.numeric(mean(d$time)),
                        breaks = brk, labels = format(brk, format = "%H:%M:%S"))

*在ggplot2(3.1.0)的当前版本中,从文档中看不出trans = "date"trans = "time"存在。在trans等人的?scale_color_gradient自变量中,也没有在?continuous_scale中提及它们。但是,我提交了一个问题,因此有望在下一个版本中更新文档。