O gráfico de série temporal é compensado em 2 horas se scale_x_datetime for usado

Problema:

Estou tentando plotar uma série temporal com ggplot, mas os dados são compensados ​​por duas horas por algum motivo.

Dados:

> test  test Source: local data frame [13 x 2] interval mean (time) (dbl) 1 2016-06-09 00:05:00 0.3396226 # First value: 5 minutes past midnight 2 2016-06-09 00:10:00 0.1320755 3 2016-06-09 00:15:00 0.1509434 4 2016-06-09 00:20:00 0.0754717 5 2016-06-09 00:25:00 2.0943396 6 2016-06-09 00:30:00 0.5283019 7 2016-06-09 00:35:00 0.8679245 8 2016-06-09 00:40:00 0.0000000 9 2016-06-09 00:45:00 1.4716981 10 2016-06-09 00:50:00 0.3018868 11 2016-06-09 00:55:00 0.1320755 12 2016-06-09 01:00:00 0.3207547 13 2016-06-09 01:05:00 0.6792453 

Exemplo

Isso funciona bem:

 g <- ggplot(interval.steps, aes(interval, mean)) g + geom_line() 

Etiquetas do eixo X mostram dados reais

Mas isso não acontece:

 g <- ggplot(interval.steps, aes(interval, mean)) g + geom_line() + scale_x_datetime(date_labels = '%H:%M') # offsets times by -2 hours 

insira a descrição da imagem aqui

Questão

O que estou fazendo de errado? Desde já, obrigado.

Parece que scale_x_datetime está alterando o fuso horário do interval do fuso horário local para o UTC. A function abaixo deve resolver o problema.

 # Source: http://stackoverflow.com/a/11002253/496488 # Put in your local timezone. I've inserted mine just for illustration. date_format_tz <- function(format = "%H:%M", tz = "America/Los_Angeles") { function(x) format(x, format, tz=tz) } g <- ggplot(interval.steps, aes(interval, mean)) g + geom_line() + scale_x_datetime(labels = date_format_tz()) 

Implementação independente de fuso horário

A resposta de Eipi10 acima é uma boa solução. No entanto, eu queria evitar codificar uma configuração de fuso horário em meu programa na tentativa de torná-lo reproduzível em qualquer localidade. A maneira de conseguir isso é muito simples, apenas deixe de fora o parâmetro tz :

 # Generator function to create 'hh:mm' labels for the x axis # without explicit 'tz' specification date_format <- function(format = "%H:%M") { function(x) format(x, format) } 

Vantagem

A vantagem desse método é que ele funciona independentemente do parâmetro de fuso horário da variável original e da localidade atual.

Por exemplo, se seus valores de tempo foram lidos com algo como isto: as.POSIXct(interval, format = '%H:%M', tz = 'Pacific/Honolulu') , o gráfico ainda será plotado com o eixo X correto labels, mesmo se você estiver, digamos, no Zimbábue.