将scale_color_gradient2与类Date的变量一起使用

Jam*_*ade 3 r date colors ggplot2 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()
Run Code Online (Sandbox Code Playgroud)

Hen*_*rik 5

需要添加两件事scale_color_gradient2:trans = "date"*和合理的midpoint(默认为0).我用mean'天'.请注意,您需要均值的数字版本scale:

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

在此输入图像描述


您可能想要更改图例中的默认中断和标签.首先,使用seq或创建一系列休息时间pretty:

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

按比例设置breaks并按labels需要format:

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

编辑以下评论:

scale_color_gradient2POSIXct变量一起使用

添加trans = "time"和理智midpointscale_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)))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


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

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"))
Run Code Online (Sandbox Code Playgroud)

*在当前版本的ggplot2(3.1.0)中,从文档中可以看出trans = "date"并且trans = "time"存在并不明显.它们既没有在等人的trans论证中提及?scale_color_gradient,也没有在?continuous_scale.但是,我提交了一个问题,因此希望在下一个版本中更新文档.