2016-11-29 5 views
0

I mit durchgehendem fehlenden Werten von 11. Januar - 14. JANUAR Jahr 2016 einen Datenrahmen haben alsausblenden/Tropfen fehlende Werte in Heatmap mit ggplot2

library(lubridate) 
    set.seed(123) 
    timestamp1 <- seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-01-10 23:59:59"), by = "hour") 
    timestamp2 <- seq(as.POSIXct("2016-01-15"),as.POSIXct("2016-01-20 23:59:59"), by = "hour") 
    data_obj <- data.frame(value = c (rnorm(length(timestamp1),150,5),rnorm(length(timestamp2),110,3)),timestamp = c(timestamp1,timestamp2)) 
    data_obj$day <- lubridate::date(data_obj$timestamp) 
    data_obj$hour <- lubridate::hour(data_obj$timestamp) 

Wenn ich eine Heatmap plotten

ggplot(data_obj,aes(day,hour,fill=value)) + geom_tile() 
mit

Ich bekomme Heatmap wie unter eins; rot markierte rechteckiger Bereich

enter image description here

zu fehlenden Werten entspricht Wie soll ich diesen leeren Bereich vollständig verbergen und eine kontinuierliche Heatmap machen?

Beachten Sie, dass ich das Format des X-Achsen-Datums nicht ändern möchte und fehlende Werte mit einer anderen Farbe anzeigen möchte.

+1

Wie planen Sie (wahrheitsgemäß) mit wem die Heatmap angezeigt wird, dass die Werte für den Zeitraum fehlen? – hrbrmstr

+0

AFAIK dies ist nicht möglich mit X-Achse als Datum (Zeit). Ich hoffe, es gibt einen Grund dafür, wie von @hrbrmstr festgestellt. –

Antwort

2

Leicht andere Antwort auf @ Jakobs, der das Datum Etikettenformat und Ordnung bewahrt:

library(lubridate) 

set.seed(123) 

timestamp1 <- seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-01-10 23:59:59"), by = "hour") 
timestamp2 <- seq(as.POSIXct("2016-01-15"),as.POSIXct("2016-01-20 23:59:59"), by = "hour") 

data_obj <- data.frame(value = c (rnorm(length(timestamp1),150,5), 
            rnorm(length(timestamp2),110,3)), 
         timestamp = c(timestamp1,timestamp2)) 
data_obj$day <- lubridate::date(data_obj$timestamp) 
data_obj$hour <- lubridate::hour(data_obj$timestamp) 

# preserve the date order manally in a factor 

data_obj$day_f <- format(data_obj$day, "%b %d") 

dplyr::arrange(data_obj, day) %>% 
    dplyr::distinct(day_f) -> day_f_order 

data_obj$day_f <- factor(data_obj$day_f, levels=day_f_order$day_f) 

ggplot(data_obj, aes(day_f, hour, fill=value)) + 
    geom_tile() + 
    scale_x_discrete(expand=c(0,0), breaks=c("Jan 04", "Jan 18")) + 
    scale_y_continuous(expand=c(0,0)) + 
    viridis::scale_fill_viridis(name=NULL) + 
    coord_equal() + 
    labs(x=NULL, y=NULL) + 
    theme(panel.background=element_blank()) + 
    theme(panel.grid=element_blank()) + 
    theme(axis.ticks=element_blank()) + 
    theme(legend.position="bottom") 

enter image description here

Hinweis: Sie sind immer noch falsch truthing die Daten zu Ihrem Publikum ohne eine explizite , sehr sichtbare Notiz, die erklärt, dass Daten fehlen.

+0

nice - Meilen bessere Lösung! – Jacob

+0

X-Achsen-Etiketten zeigen fehlende Tage an. –

+0

nicht explizit. es ist eine unehrliche Visualisierung, wenn Sie keine offene Notiz machen. Zeitraum. keine Debatte. Wahrheit ist Wahrheit. – hrbrmstr

1

Wenn Sie den Tag auf einen Faktor ändern, ignoriert es die Lücke:

ggplot(data_obj, aes(factor(day),hour,fill=value)) + geom_tile() 

Je nachdem, was die reale Sache aussieht können Sie oder können nicht glücklich sein mit, wie die x-Achse aussieht.

+0

OP hat darum gebeten, dass sich die X-Achse nicht ändert. –

Verwandte Themen