I'm trying to color by date with ggplot2, but when I try to customize the color using scale_color_gradient2, I get an error saying Error in as.Date.numeric(value) : 'origin' must be supplied.
I can't seem to figure out how to pass the origin to scale_color_gradient2.
I've provided an example below. Any advice?
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()
Two things need to be added to scale_color_gradient2: trans = "date"* and a sensible midpoint (default is 0). I used mean 'day'. Note that you need the numeric version of the mean in scale:
ggplot(myData, aes(x = x1, y = x2, color = day)) +
geom_point() +
scale_color_gradient2(trans = "date", midpoint = as.numeric(mean(myData$day)))

You may want to change the default breaks and labels in the legend. First, create a sequence of breaks, using seq or pretty:
brk <- seq.Date(min(myData$day), max(myData$day), by = "3 month")
# brk <- pretty(myData$day)
Set breaks and labels with desired format in your scale:
scale_color_gradient2(trans = "date", midpoint = as.numeric(mean(myData$day)),
breaks = brk,
labels = format(brk, "%Y-%m"))
Edit following comment:
scale_color_gradient2 with POSIXct variableAdd trans = "time" and a sensible midpoint to scale_color_gradient2. Here I use a mean 'time'. Note that you need the numeric version of the mean in 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)))

Possibly change breaks and labels in the legend, e.g.
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"))
*In the current version of ggplot2 (3.1.0), it is not obvious from the docs that trans = "date" and trans = "time" exist. They are mentioned neither in the trans argument in ?scale_color_gradient et al., nor in ?continuous_scale. However, I submitted an issue so the docs will hopefully be updated in the next release.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With