我正在尝试使用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()
最佳答案
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)))
您可能需要更改图例中的默认中断和标签。首先,使用
seq
或pretty
创建一个中断序列:brk <- seq.Date(min(myData$day), max(myData$day), by = "3 month")
# brk <- pretty(myData$day)
在您的比例尺中将
breaks
和labels
设置为所需的format
:scale_color_gradient2(trans = "date", midpoint = as.numeric(mean(myData$day)),
breaks = brk,
labels = format(brk, "%Y-%m"))
编辑以下评论:
将
scale_color_gradient2
与POSIXct
变量一起使用将
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)))
可能更改图例中的中断和标签,例如
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
中提及它们。但是,我提交了一个问题,因此有望在下一个版本中更新文档。
关于r - 将scale_color与类日期的变量一起使用会产生错误:as.Date.numeric(value):必须提供'origin',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54699751/