Vou mostrar aqui como montar um gráfico de tendência com datas. Este gráfico é muito útil para acompanhar a performance do trabalho conforme descrito aqui.
Office
Para montar o gráfico, seja no MS-Office, ou no Google-Docs, ou ainda no LibreOffice, o processo é muito semelhante. Vou utilizar o Google-Docs, mas não há diferenças significativas para outros ambientes.
Para iniciar os dados devem estar organizados em forma tabular conforme mostrado na
Selecionando a área dos dados, selecione Incluir novo gráfico, e o tipo “Gráfico de Dispersão” (Scatter Diagram).
Você deve garantir que haja uma série de dados definida para cada coluna de cada resultado intermediário. Para cada uma das séries você deve solicitar que seja incluída uma linha de tendência.
O que nos gera um gráfico na forma:
Um problema com todas estas ferramentas é que não é possível transmutar os eixos e colocar o ponto (0,0) no canto superior esquerdo. Por isto, as tendências devem ser visualizadas da esquerda para a direita e não de cima para baixo.
GGPLOT2
Outra opção é utilizar a biblioteca ggplot2 do tidyverse para construir um gráfico mais customizado.
Neste caso, os dados são arrumados dentro de um tibble conforme mostrado abaixo:
Para desenharmos o gráfico como queremos precisamos de uma função que faça a transposição dos valores dos eixos, colocando o ponto (0,0) no canto superior esquerdo.
Para isto temos a função c_trans definida no código a seguir.
A estrutura do tibble é modificada para ficar num formato tidy.
Por fim, montamos o gráfico com pontos e linhas.
```{r}#| label: fig-1#| warning: false#| message: false#| fig-cap: "Gráfico de cordas"# using the function from @Marcelo from this link # https://stackoverflow.com/questions/43625341/reverse-datetime-posixct-data-axis-in-ggplot # to invert the data axis: library(scales) # for as.translibrary(ggtext) # for markdownlibrary(grid) # arrow# c_trans <- function(a, b, breaks = b$breaks, format = b$format) {# a <- as.trans(a)# b <- as.trans(b)# # name <- paste(a$name, b$name, sep = "-")# # trans <- function(x) a$trans(b$trans(x))# inv <- function(x) b$inverse(a$inverse(x))# # trans_new(name, trans, inverse = inv, breaks = breaks, format=format)# }# rev_date <- c_trans("reverse", "time")m_entregas <- entregas %>% pivot_longer(cols = c(m1, m2, m3, m4, m5), names_to = "milestone", values_to = "previsto")y_breaks <- m_entregas %>% distinct(status) %>% arrange(status) %>% pull() #%>% as.POSIXct()m_labels <- m_entregas %>% filter(status <= min(status)) # %>% mutate(status = as.POSIXct(status - 2), previsto = as.POSIXct(previsto + 3))reverse2_trans <- function() { trans_new( "reverse2", function(x) -1 * as.numeric(x), # Force values to be numeric for Date objects function(x) -1 * as.numeric(x) )}m_entregas %>% # mutate(status = as.POSIXct(status), # previsto = as.POSIXct(previsto)) %>% ggplot(aes(x = previsto, y = status, group = milestone, colour = milestone)) + geom_point() + geom_line() + geom_text(data = m_labels, aes(x = previsto, y = status, label = milestone)) + scale_y_continuous( trans = c("date", "reverse2") ) + #scale_y_reverse(trans = rev_date, breaks = y_breaks, labels = ~ strftime(., "%b %d")) + labs(title = "Previsão das Entregas", x = NULL, y = NULL) + theme_minimal() + theme( legend.position = "none", plot.title = element_markdown(lineheight = 1.1), axis.text.x = element_blank(), panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), panel.grid.major.y = element_line(arrow = arrow(angle = 20, length = unit(0.1, "inches"), type = "closed")) ) ```
Um colega que trabalhava comigo costumava chamá-lo de Gráfico de Cordas. Nunca achei referência que utiliza-se este nome, pois trata-se na verdade de um gráfico de dispersão composto com um gráfico de linhas (ou um de tendência como mostrei no exemplo em Calc), mas ainda assim costumo utilizar este nome.
Citation
BibTeX citation:
@misc{abreu2022,
author = {Abreu, Marcos},
title = {Como construir um gráfico de tendência com datas},
date = {2022-11-10},
url = {https://abreums.github.io/posts/2019-11-10-como-criar-um-grafico-de-cordas/},
langid = {pt-br}
}