我正在尝试使用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()
答案 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)))
您可能想更改图例中的默认中断和标签。首先,使用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
中提及它们。但是,我提交了一个问题,因此有望在下一个版本中更新文档。