Не можете использовать geom_col для построения объекта POSIXct? - PullRequest
0 голосов
/ 02 января 2019

У меня есть набор данных:

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")

enter image description here

Но мне нужно построить барплот, поэтому я использую следующий код, который не очень хорошо работает:

ggplot(dum, aes(y=v2, x=v1)) + 
geom_col(fill="#59AA46")

enter image description here

Что я делаю не так?

1 Ответ

0 голосов
/ 02 января 2019

Дело в том, что 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 H: M: S).

Один из обходных путей, который вы можете сделать, - это использовать время 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

В конце концов я получил это:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...