Esta pergunta é uma continuação desta ( Mensagem de aviso: 2 linhas contendo valores ausentes foram removidas (`geom_tile()`) ). Alguns dias são fins de semana e gostaria de comunicar isso no gráfico. No momento, codifiquei os valores de fim de semana com um número negativo e alterei a escala para que aparecessem em azul. Não tenho certeza se é isso que eu quero. O ideal seria que os fins de semana tivessem o mesmo valor positivo, mas talvez um texto com uma cor diferente (branco em vez de preto) e/ou uma borda ao redor do bloco. Tenho uma coluna booleana que me informa se são fins de semana. Talvez haja uma visualização melhor que possa identificar os dias de fim de semana?
hours <- c(16, 17, 0, 1, 2, 21, 22, 9, 19, 20)
days <- c(0, 0, 3, 3, 3, 6, 6, 11, 21, 21)
value <- c(3, 60, -18, -60, -23, 51, 48, 49, 47, 40)
weekend<- c(FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE)
df <- data.frame(hours, days, value, weekend)
h<-1
w<-1
ggplot(df, aes(days, hours)) +
geom_tile(aes(fill = value, width = w, height = h)) +
geom_text(aes(label = value), size = 3) +
scale_fill_continuous(limits=c(-60,60),breaks=seq(-60,60,20),low = "blue", high = "red") +
xlab("Day") +
ylab("Hour") +
scale_x_continuous(
breaks = seq(0, 41, by = 7),
expand = c(0.05, 0.05)
) +
scale_y_continuous(
breaks = seq(0, 23, by = 3),
expand = c(0.05, 0.05)
) +
coord_cartesian(xlim=c(0,41),ylim=c(0,23))
Responder:
hours <- c(16, 17, 0, 1, 2, 21, 22, 9, 19, 20)
days <- c(0, 0, 3, 3, 3, 6, 6, 11, 21, 21)
value <- c(3, 60, 18, 60, 23, 51, 48, 49, 47, 40)
weekend<- c("black","black","white","white","white","black","black","black","black","black")
df <- data.frame(hours, days, value, weekend)
h<-1
w<-1
ggplot(df, aes(days, hours)) +
geom_tile(aes(fill = value, width = w, height = h)) +
geom_text(aes(label = value), size = 4, colour=weekend) +
scale_fill_continuous(limits=c(0,60),breaks=seq(-0,60,10),low = "white", high = "red") +
xlab("Day") +
ylab("Hour") +
scale_x_continuous(
breaks = seq(0, 41, by = 7),
expand = c(0.05, 0.05)
) +
scale_y_continuous(
breaks = seq(0, 23, by = 3),
expand = c(0.05, 0.05)
) +
coord_cartesian(xlim=c(0,41),ylim=c(0,23))
Acho que seu segundo bloco de código ("Resposta:") é uma boa abordagem, embora você possa ter problemas quando a
fill
luz for clara o suficiente para que as letras brancas nos fins de semana fiquem desbotadas. Uma alternativa é colorir o dia inteiro com uma cor de fundo diferente. Isso contribui para o fluxo semanal do gráfico e permite alguma flexibilidade para manter as letras legíveis em uma variedade de cores.Usarei
hours
,days
, evalue
do segundo bloco (para que tenhamos todos valores positivos) e o lógicoweekend
do primeiro bloco. Adicionareitheme_bw()
para simplificar o enredo, permitindo que os cenários de fim de semana se destaquem de forma mais apropriada.Uma coisa que não gosto é que apenas um fim de semana é destacado. Seria interessante destacar todos os dias do fim de semana, mesmo sem dados. Não sei quais dias são realmente fins de semana, então presumo que, como o dia 3 é um fim de semana, o dia 4 também é um fim de semana (e as semanas anteriores/posteriores).
Se você quiser ter uma legenda descrevendo o que o fundo significa, podemos usar
ggnewscale::new_scale_fill()
para adicionar uma segunda legenda: