ggplot2 和 plotly 的悬停日期格式

Date format in hover for ggplot2 and plotly

我对 plotly 中的日期格式有疑问。我在 ggplot2 中制作了一个时间序列图,我试图用 plotly 进行可视化,但是悬停时出现了日期时间的格式问题(见图)。我希望日期格式为 YYMMD-hh:mm。我怎样才能得到这种格式?

我的脚本中的相关 R 代码:

library(lubridate)
datosO3.melt <- melt(datosO3.plot, id.vars="fecha", value.name="value")
ozono.plot <- ggplot() + geom_line(data=datosO3.melt, aes(x=fecha, y=value, colour=variable))
ggplotly(ozono.plot)

重点是数据框中的列 fecha 是在前一个数据框中创建的日期时间对象。

datosO3<-within(datosO3, fecha.hora <- ymd_hm(paste(datosO3$AAMMDD,datosO3$hhmm,sep="")))

并由 datosO3.melt

继承
str(datosO3.melt)
'data.frame':   23328 obs. of  3 variables:
 $ fecha   : POSIXct, format: "2017-06-13 00:00:00" "2017-06-13 00:10:00" ...
 $ variable: Factor w/ 54 levels "Alcoi.Verge_dels_Lliris",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : num  75 76 73 72 71 72 73 74 74 73 ...

但是当我 dput 我得到:

> dput(data)
structure(list(fecha = structure(c(1497312000, 1497312600, 1497313200, 
1497313800, 1497314400, 1497315000, 1497315600, 1497316200, 1497316800, 
1497317400, 1497318000, 1497318600, 1497319200, 1497319800, 1497320400, 
1497321000, 1497321600, 1497322200, 1497322800, 1497323400, 1497324000, 
1497324600, 1497325200, 1497325800, 1497326400, 1497327000, 1497327600, 
1497328200, 1497328800, 1497329400, 1497330000, 1497330600, 1497331200, 
1497331800, 1497332400, 1497333000, 1497333600, 1497334200, 1497334800, 
1497335400, 1497336000, 1497336600, 1497337200, 1497337800, 1497338400, 
1497339000, 1497339600, 1497340200, 1497340800, 1497341400, 1497342000, 
1497342600, 1497343200, 1497343800, 1497344400, 1497345000, 1497345600, 
1497346200, 1497346800, 1497347400, 1497348000, 1497348600, 1497349200, 
1497349800, 1497350400, 1497351000, 1497351600, 1497352200, 1497352800, 
1497353400, 1497354000, 1497354600, 1497355200, 1497355800, 1497356400, 
1497357000, 1497357600, 1497358200, 1497358800, 1497359400, 1497360000, 
1497360600, 1497361200, 1497361800, 1497362400, 1497363000, 1497363600, 
1497364200, 1497364800, 1497365400, 1497366000, 1497366600, 1497367200, 
1497367800, 1497368400, 1497369000, 1497369600, 1497370200, 1497370800, 
1497371400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("Alcoi.Verge_dels_Lliris", "Alacant.El_Pla", 
    "Alacant.Florida_Babel", "Alacant.Rabassa", "Benidorm", "Elx.Agroalimentari", 
    "Elx.Parc_de_Bombers", "Elda.Lacy", "Orihuela", "El_Pinos", 
    "Torrevieja", "L.Alcora", "Burriana", "Castello.Penyeta", 
    "Castello.Ermita", "Castello.Grau", "Castello.Patronat_d.Esports", 
    "Cirat", "Morella", "Onda", "Coratxar", "Sant_Jordi", "Torre_Endomenech", 
    "La_Vall_d.Uixo", "Vilafranca", "Vinaros_Planta", "Viver", 
    "Zorita", "Albalat_dels_Tarongers", "Alzira", "Algar_de_Palancia", 
    "Beniganim", "Bunnol.Cemex", "Burjassot.Facultats", "Caudete_de_las_Fuentes", 
    "Cortes_de_Pallas", "Quart_de_Poblet", "Gandia", "Ontinyent", 
    "Paterna.CEAM", "Sagunt.Port", "Sagunt.Nord", "Sagunt.CEA", 
    "Torrebaja", "Valencia.Pista_de_Silla", "Valencia.Vivers", 
    "Valencia.Politecnic", "Valencia.Avd._Francia", "Valencia.Moli_del_Sol", 
    "Valencia.Bulevard_Sud", "Vilamarxant", "Villar_del_Arzobispo", 
    "Torrent.El_Vedat", "Chiva_UM"), class = "factor"), value = c(75, 
    76, 73, 72, 71, 72, 73, 74, 74, 73, 71, 72, 71, 72, 74, 74, 
    73, 73, 73, 74, 74, 74, 72, 72, 72, 71, 70, 70, 70, 70, 72, 
    71, 68, 66, 68, 68, 65, 61, 63, 65, 71, 71, 79, 91, 84, 82, 
    91, 94, 91, 88, 88, 92, 99, 102, 103, 100, 105, 104, 104, 
    101, 102, 100, 101, 104, 109, 109, 112, 115, 116, 116, 113, 
    111, 110, 113, 113, 114, 115, 115, 114, 113, 111, 112, 115, 
    114, 112, 112, 114, 116, 116, 115, 114, 115, 113, 112, 112, 
    110, 109, 110, 110, 111)), .Names = c("fecha", "variable", 
"value"), row.names = c(NA, 100L), class = "data.frame")
> 

如何更改悬停中反映的 fecha 格式?

编辑 1: 添加数据

> dput(datosO3.plot)
structure(list(Alcoi.Verge_dels_Lliris = c(75, 76, 73, 72, 71, 
72), Alacant.El_Pla = c(56, 55, 53, 56, 55, 54), Alacant.Florida_Babel = c(56, 
49, 48, 45, 44, 42), Alacant.Rabassa = c(43, 42, 43, 41, 41, 
43), Benidorm = c(110, 105, 95, 107, 110, 107), Elx.Agroalimentari = c(80, 
77, 75, 69, 64, 62), Elx.Parc_de_Bombers = c(71, 68, 67, 68, 
65, 66), Elda.Lacy = c(39, 34, 32, 28, 25, 26), Orihuela = c(16, 
13, 25, 13, 17, 9), El_Pinos = c(48, 35, 36, 35, 33, 43), Torrevieja = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), L.Alcora = c(40, 
45, 42, 44, 48, 50), Burriana = c(14, 8, 8, 9, 7, 7), Castello.Penyeta = c(57, 
61, 68, 65, 58, 59), Castello.Ermita = c(18, 20, 14, 16, 21, 
19), Castello.Grau = c(20, 21, 19, 13, 11, 16), Castello.Patronat_d.Esports = c(36, 
26, 29, 28, 28, 29), Cirat = c(56, 56, 54, 54, 51, 51), Morella = c(119, 
121, 122, 122, 123, 123), Onda = c(57, 58, 57, 58, 60, 60), Coratxar = c(123, 
125, 126, 127, 128, 125), Sant_Jordi = c(37, 36, 37, 38, 40, 
39), Torre_Endomenech = c(28, 34, 35, 32, 30, 30), La_Vall_d.Uixo = c(63, 
64, 65, 65, 64, 65), Vilafranca = c(100, 101, 97, 98, 97, 99), 
    Vinaros_Planta = c(26.7, 31.3, 31.6, 31.7, 37.8, 41.7), Viver = c(40.6, 
    36.9, 47.6, 36.7, 43.5, 46.1), Zorita = c(67, 70, 69, 64, 
    64, 68), Albalat_dels_Tarongers = c(33, 32, 32, 29, 26, 26
    ), Alzira = c(24, 26, 23, 19, 20, 39), Algar_de_Palancia = c(47, 
    50, 48, 49, 47, 52), Beniganim = c(53, 58, 56, 56, 54, 53
    ), Bunnol.Cemex = c(64, 55, 53, 53, 53, 55), Burjassot.Facultats = c(43, 
    30, 30, 28, 16, 20), Caudete_de_las_Fuentes = c(71, 68, 66, 
    72, 74, 72), Cortes_de_Pallas = c(88, 74, 78, 82, 82, 85), 
    Quart_de_Poblet = c(13, 18, 21, 23, 30, 38), Gandia = c(45, 
    39, 49, 49, 48, 46), Ontinyent = c(88, 83, 83, 89, 86, 82
    ), Paterna.CEAM = c(48, 49, 47, 47, 48, 47), Sagunt.Port = c(52, 
    51, 51, 50, 50, 49), Sagunt.Nord = c(33, 34, 34, 32, 31, 
    31), Sagunt.CEA = c(34.8, 36.3, 37.6, 43.8, 40.7, 37.5), 
    Torrebaja = c(51, 42, 56, 52, 45, 65), Valencia.Pista_de_Silla = c(37, 
    52, 57, 60, 35, 7), Valencia.Vivers = c(45, 42, 39, 34, 32, 
    33), Valencia.Politecnic = c(40, 33, 30, 26, 25, 23), Valencia.Avd._Francia = c(54, 
    50, 50, 48, 45, 43), Valencia.Moli_del_Sol = c(9, 10, 10, 
    8, 7, 9), Valencia.Bulevard_Sud = c(1, 0, 0, 2, 0, 0), Vilamarxant = c(21, 
    29, 33, 27, 33, 22), Villar_del_Arzobispo = c(55, 57, 57, 
    54, 53, 55), Torrent.El_Vedat = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), Chiva_UM = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), fecha = structure(c(1497312000, 
    1497312600, 1497313200, 1497313800, 1497314400, 1497315000
    ), class = c("POSIXct", "POSIXt"), tzone = "UTC")), .Names = c("Alcoi.Verge_dels_Lliris", 
"Alacant.El_Pla", "Alacant.Florida_Babel", "Alacant.Rabassa", 
"Benidorm", "Elx.Agroalimentari", "Elx.Parc_de_Bombers", "Elda.Lacy", 
"Orihuela", "El_Pinos", "Torrevieja", "L.Alcora", "Burriana", 
"Castello.Penyeta", "Castello.Ermita", "Castello.Grau", "Castello.Patronat_d.Esports", 
"Cirat", "Morella", "Onda", "Coratxar", "Sant_Jordi", "Torre_Endomenech", 
"La_Vall_d.Uixo", "Vilafranca", "Vinaros_Planta", "Viver", "Zorita", 
"Albalat_dels_Tarongers", "Alzira", "Algar_de_Palancia", "Beniganim", 
"Bunnol.Cemex", "Burjassot.Facultats", "Caudete_de_las_Fuentes", 
"Cortes_de_Pallas", "Quart_de_Poblet", "Gandia", "Ontinyent", 
"Paterna.CEAM", "Sagunt.Port", "Sagunt.Nord", "Sagunt.CEA", "Torrebaja", 
"Valencia.Pista_de_Silla", "Valencia.Vivers", "Valencia.Politecnic", 
"Valencia.Avd._Francia", "Valencia.Moli_del_Sol", "Valencia.Bulevard_Sud", 
"Vilamarxant", "Villar_del_Arzobispo", "Torrent.El_Vedat", "Chiva_UM", 
"fecha"), row.names = 289:294, class = "data.frame")

我们可以使用 "hidden" text aes,在工具提示中使用它:

ggplot(datosO3.melt) +
    geom_line(aes(x      = fecha, 
                  y      = value, 
                  colour = variable,
                  group  = variable,
                  text   = paste('fecha: ', fecha, '\n',
                                 'variable: ', variable, '\n',
                                 'value: ', value, '\n')
                  )
              )

ggplotly(tooltip = 'text')

然而,对于任何比默认稍微复杂的东西,尤其是在使用悬停工具提示时,我通常更喜欢直接在 plotly:

中工作
plot_ly(datosO3.melt, 
        type      = 'scatter', 
        mode      = 'lines', 
        x         = ~fecha, 
        y         = ~value, 
        color     = ~variable,
        text      = ~paste('fecha: ', fecha, '\n',
                           'variable: ', variable, '\n',
                           'value: ', value, '\n'),
        hoverinfo = 'text'
        )

要使用自定义日期格式,除 print.Date 默认值外,只需将 fecha 替换为您喜欢的格式,例如:

plot_ly(datosO3.melt, 
        type = 'scatter', 
        mode = 'lines', 
        x = ~fecha, 
        y = ~value, 
        color = ~variable,
        text = ~paste('fecha: ', format(fecha, '%Y-%m-%d %H:%M'), '\n',
                           'variable: ', variable, '\n',
                           'value: ', value, '\n'),
        hoverinfo = 'text'
        )