saldo_mensal <- Arqueo.CAGED.2022_2025 %>%
dplyr::filter(anocompetênciamov != "2021") %>%
group_by(anocompetênciamov, mêscompetênciamov, saldomovimentação) %>%
summarise(quantidade = n(), .groups = "drop") %>%
pivot_wider(names_from = saldomovimentação, values_from = quantidade, values_fill = 0) %>%
mutate(Saldo = Admitido - Desligado) %>%
pivot_longer(cols = c(Admitido, Desligado, Saldo),
names_to = "saldomovimentação",
values_to = "quantidade") %>%
mutate(Ano_num = as.numeric(factor(anocompetênciamov,
levels = c(2022, 2023, 2024, 2025)))) %>%
mutate(mêscompetênciamov = factor(mêscompetênciamov,
levels = c("Janeiro", "Fevereiro", "Março", "Abril", "Maio",
"Junho", "Julho", "Agosto", "Setembro",
"Outubro", "Novembro", "Dezembro")))
p_mensal <- saldo_mensal %>%
mutate(saldomovimentação = factor(saldomovimentação,
levels = c("Admitido", "Desligado", "Saldo"))) %>%
ggplot(aes(x = Ano_num, y = quantidade,
group = saldomovimentação, color = saldomovimentação,
text = paste0(
"Ano: ", c(2022, 2023, 2024, 2025)[Ano_num], "<br>",
saldomovimentação, ": ", quantidade
))) +
geom_line(linewidth = 0.9) +
geom_point(size = 2.5) +
geom_hline(yintercept = 0, color = "red", linewidth = 0.7) +
facet_wrap(~ mêscompetênciamov, ncol = 4, nrow = 3, scales = "free_x") + # ← só x livre
scale_x_continuous(
breaks = 1:4, labels = c(2022, 2023, 2024, 2025),
expand = expansion(mult = c(0.05, 0.15))
) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
scale_color_manual(
values = c("Admitido" = "#1874CD", "Desligado" = "#CD2626", "Saldo" = "#008B45"),
name = NULL
) +
labs(x = "", y = "") +
theme_bw() +
theme(
axis.text.x = element_text(angle = 0, hjust = 0.5, size = 8),
axis.text.y = element_text(size = 8),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "lightgray"),
strip.text = element_text(face = "bold", size = 9),
legend.position = "bottom",
legend.background = element_rect(fill = "white", color = "gray50"),
plot.title = element_blank(),
plot.subtitle = element_blank(),
panel.spacing.x = unit(0.3, "cm"),
panel.spacing.y = unit(0.8, "cm"),
plot.margin = margin(t = 5, r = 10, b = 5, l = 10, unit = "pt")
)
fig <- ggplotly(p_mensal, tooltip = "text", height = 780) %>%
layout(
legend = list(
title = list(text = ""),
orientation = "h",
x = 0.5,
xanchor = "center",
y = -0.12,
yanchor = "top"
),
margin = list(t = 20, l = 50, r = 30, b = 130),
hoverlabel = list(
bgcolor = "rgba(255,255,255,0.9)",
bordercolor = "rgba(0,0,0,0)",
font = list(color = "black")
)
) %>%
config(
responsive = TRUE,
displayModeBar = FALSE
)
series_colors <- c("Admitido" = "#1874CD", "Desligado" = "#CD2626", "Saldo" = "#008B45")
for (i in seq_along(fig$x$data)) {
trace_name <- fig$x$data[[i]]$name
if (!is.null(trace_name) && trace_name %in% names(series_colors)) {
fig$x$data[[i]]$hoverlabel <- list(
bgcolor = "rgba(255,255,255,0.9)",
bordercolor = series_colors[trace_name],
font = list(color = "black", size = 12)
)
}
}
y_axes <- grep("^yaxis", names(fig$x$layout), value = TRUE)
for (ax in y_axes) {
ticks <- fig$x$layout[[ax]]$tickvals
if (!is.null(ticks)) {
colored <- sapply(ticks, function(v) {
if (v < 0) paste0('<span style="color:red">', v, '</span>') else as.character(v)
})
fig$x$layout[[ax]]$ticktext <- colored
fig$x$layout[[ax]]$tickfont <- list(size = 10)
}
}
titulo_html <- tags$div(
class = "titulo-grafico",
style = "text-align: center; margin-bottom: 6px; width: 100%;",
tags$p(
"Mercado de Trabalho Formal de Arqueólogos - Novo CAGED 2022 a 2025",
style = "font-size: 15px; font-weight: bold; margin: 0; text-align: center;"
),
tags$p(
"Distribuição Mensal das Movimentações",
style = "font-size: 12px; font-weight: bold; margin: 0; color: #555; text-align: center;"
)
)
browsable(tagList(titulo_html, fig))