Не можете использовать geom_col для построения объекта POSIXct?
У меня есть набор данных:
vec=c("1960-01-01 06:39:00","1960-01-01 05:10:00","1960-01-01 04:30:00","1960-01-01 02:53:00")
vec=as.POSIXct(vec, origin="1960-01-01", tz = "GMT")
dum=data.frame(v1=c("a","b","c","d"),v2=vec)
Если я пытаюсь построить сюжет с линией, это работает:
ggplot(dum, aes(y=v2, x=v1, group=1)) +
geom_line(colour="#59AA46")
Но мне нужно построить барплот, поэтому я использую следующий код, который работает не так хорошо:
ggplot(dum, aes(y=v2, x=v1)) +
geom_col(fill="#59AA46")
Что я делаю неправильно?
1 ответ
Дело в том, что ggplot будет использовать unix time для оси (по умолчанию это количество секунд, прошедших с 1 января 1970 года (полночь UTC/GMT)).
В ваших данных дата восходит к 1960 году, что означает значения на y-axis
являются не только отрицательными, но они также все ниже 13e+6
(количество секунд в году).
поскольку geom_line
или же geom_point
будет принимать во внимание только эти значения, этот факт не вызовет каких-либо проблем при построении, однако geom_col
или же geom_bar
будет кодировать для каждого бара начальное и конечное значение, и в вашем случае оно всегда будет начинаться в точке 0 (т.е. 1970-01-01 00:00:00) и заканчиваться в некоторой точке, чуть ниже 31e+6 (то есть 1960-01-01 Ч: М: С).
Один из обходных путей, который вы можете сделать, это использовать время Unix и поэкспериментировать с макетом, пока вы не получите желаемый результат.
Вот что я имею в виду:
# define the y-axis limits
start_lim <- as.integer(as.POSIXct("1960-01-01 00:00:00", tz = "GMT"))
end_lim <- as.integer(as.POSIXct("1960-01-02 00:00:00", tz = "GMT"))
# plot
ggplot(dum, aes(x=v1, y=as.integer(v2))) + # use v2 as integer
geom_col(fill="#59AA46") +
coord_cartesian(ylim = c(start_lim, end_lim)) + # set the y limits
scale_y_reverse(breaks = as.integer(vec), # reverse the y axis
labels = vec) + # set the labels and ticks as wanted
ylab('Date-time') # set the axis title
В конце концов я получил это: