2013-09-13 2 views
3

У меня проблема с пониманием разницы между geom_segment и annotate(segment, ...), когда речь заходит о графиках с датами на оси x.Как использовать аннотацию ggplot2 с датами по оси x?

Давайте начнем с некоторыми случайными данными:

library(data.table) 
library(lubridate) 
library(ggplot2) 

# Prepare some random data 
set.seed(1234) 
dt <- data.table(x = rnorm(365*5), d = seq(ymd(20130101), ymd(20131231), by = 86400)) 
dt.m <- dt[, list(total = sum(x)), by = list(month = floor_date(d, "month"))] 
# Create a basic scatterplot chart 
p <- qplot(month, total, data = dt.m) 

Оба следующие работы и добавить сегмент к участку p определено выше:

# Both of these work as expected and produce the same result 
p + geom_segment(x = as.numeric(ymd(20130401)), xend = as.numeric(ymd(20130701)), 
    y = -10, yend = 10) 
p + geom_segment(aes(x = ymd(20130401), xend = ymd(20130701), 
    y = -10, yend = 10)) 

ggplot2 chart with geom_segment

Однако, ни один из следующие annotate("segment", ...) называет работу - и они создают разные сообщения об ошибках, которые я не могу разобрать.

> p + annotate("segment", x = as.numeric(ymd(20130401)), xend = as.numeric(ymd(20130701)), 
    y = -10, yend = 10) 
Error: Invalid input: time_trans works with objects of class POSIXct only 

> p + annotate("segment", x = ymd(20130401), xend = ymd(20130701), 
    y = -10, yend = 10) 
Error in Ops.POSIXt((x - from[1]), diff(from)) : 
    '/' not defined for "POSIXt" objects 

> p + annotate("segment", aes(x = ymd(20130401), xend = ymd(20130701), 
    y = -10, yend = 10)) 
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
    cannot coerce class ""uneval"" to a data.frame 

Я моделировал annotate("segment", ...) вызовы после получения 7.4 в R Graphics Cookbook, и это, кажется, работает хорошо с простыми графиками, которые не имеют дат в оси х.

Буду признателен, если кто-нибудь сможет объяснить, что здесь происходит.

ответ

Смежные вопросы