Cada questão está em uma aba. As questões 1 a 6 usam os gráficos do R tradicional. As questões 7 a 10 usam o Plotly.
O primeiro gráfico é a linha do tempo de resposta para cada
quantidade de nós de névoa. Os cinco seguintes comparam, em barras e com
escala logarítmica no eixo y, o cenário sem névoa com cada quantidade de
nós. As cores das barras são #E6E6E6 e
#666666. O layout() coloca a linha na largura
toda e as barras em grade.
MRT_1F <- c(
517.1468515630205, 85.13094142168089, 30.333207896694553,
12.694776264558937, 3.3041601673945418, 1.1823111717498882,
1.1892293502386786
)
MRT_3F <- c(
156.68929936163462, 11.540837783562276, 0.4512835621696538,
0.4509797929766453, 0.4502068233039181, 0.4496185276300172,
0.4543157082191288
)
MRT_5F <- c(
83.90319666471157, 0.3068151086494968, 0.30522314133037304,
0.3072588968084928, 0.30655265997285697, 0.3055812715727718,
0.3053297166713006
)
MRT_10F <- c(
29.55430642951759, 0.19832832665772515, 0.1971923924717474,
0.19796648905716516, 0.19615594370806338, 0.2034569237883263,
0.19617420889447737
)
MRT_15F <- c(
11.317736530583566, 0.167364215666193, 0.16172168266811013,
0.16701085329580515, 0.1598052657153692, 0.1645934043532696,
0.16216563797118075
)
MRT_sem_F <- c(
11.93430909937736, 0.6095414637034009, 0.6060645101029295,
0.612167181646899, 0.6146761002685637, 0.6096747087200697,
0.6125810476877268
)
clock <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)
layout(matrix(c(
1, 1,
2, 3,
4, 5,
6, 6
), ncol = 2, byrow = TRUE))
par(mar = c(4.2, 4.2, 1.2, 1))
series <- list(
"1 Fog" = MRT_1F,
"3 Fogs" = MRT_3F,
"5 Fogs" = MRT_5F,
"10 Fogs" = MRT_10F,
"15 Fogs" = MRT_15F,
"w/o Fog" = MRT_sem_F
)
cores_linha <- c("black", "orange", "red", "blue", "forestgreen", "yellowgreen")
simbolos <- c(15, 17, 16, 18, 1, 4)
plot(
clock, series[[1]], type = "o",
col = cores_linha[1], pch = simbolos[1],
ylim = c(0, max(unlist(series))),
xlab = "Time between Things requests (seconds)",
ylab = "Response time (s)"
)
for (i in 2:length(series)) {
lines(
clock, series[[i]], type = "o",
col = cores_linha[i], pch = simbolos[i]
)
}
legend(
"topright",
legend = names(series),
col = cores_linha,
pch = simbolos,
lty = 1,
cex = 0.8
)
grafico_barras <- function(valores, nome) {
matriz <- rbind(MRT_sem_F, valores)
barplot(
matriz,
beside = TRUE,
log = "y",
ylim = c(min(matriz) * 0.7, max(matriz) * 1.3),
col = c("#E6E6E6", "#666666"),
names.arg = clock,
xlab = "Time between Things requests",
ylab = "Response time (s)"
)
legend(
"topright",
legend = c("w/o Fog", nome),
fill = c("#E6E6E6", "#666666"),
cex = 0.8
)
}
grafico_barras(MRT_1F, "1 Fog")
grafico_barras(MRT_3F, "3 Fogs")
grafico_barras(MRT_5F, "5 Fogs")
grafico_barras(MRT_10F, "10 Fogs")
grafico_barras(MRT_15F, "15 Fogs")A tabela cruza a qualidade da refeição com a faixa de preço. Cada coluna soma 100%. O gráfico empilha essas três categorias em cada faixa.
qualidade <- rbind(
Good = c(53.8, 33.9, 2.6, 0.0),
"Very Good" = c(43.6, 54.2, 60.5, 21.4),
Excellent = c(2.6, 11.9, 36.8, 78.6)
)
colnames(qualidade) <- c("$10-19", "$20-29", "$30-39", "$40-49")
cores_qualidade <- c("#4C78A8", "#F58518", "#54A24B")
barplot(
qualidade,
col = cores_qualidade,
xlab = "Meal Price",
ylab = "Porcentagem (%)",
main = "Qualidade da refeição por faixa de preço",
ylim = c(0, 100)
)
legend(
"topright",
legend = rownames(qualidade),
fill = cores_qualidade,
title = "Quality Rating"
)As temperaturas de maio do conjunto airquality estão em
Fahrenheit. A conversão é °C = (°F − 32) / 1.8. O histograma usa
densidade, na mesma escala da curva.
maio <- airquality[airquality$Month == 5, ]
temp_c <- (maio$Temp - 32) / 1.8
hist(
temp_c,
freq = FALSE,
col = "steelblue",
border = "white",
main = "Temperaturas de maio",
xlab = "Temperatura (°C)",
ylab = "Densidade"
)
lines(density(temp_c), col = "firebrick", lwd = 2)As vendas vêm da tabela do enunciado. Cada fatia mostra o país e a
porcentagem sobre o total. A legenda repete as cores com
legend().
url_vendas <- paste0(
"https://www.dropbox.com/scl/fi/mpjt4uuqb5vtmfiw38phk/Sales.txt",
"?rlkey=93jlz79xwrrt7ah66d5k403d7&dl=1"
)
sales <- tryCatch(
read.table(url_vendas, header = TRUE),
error = function(e) read.table("data/Sales.txt", header = TRUE)
)
porcentagem <- round(100 * sales$SALES / sum(sales$SALES), 1)
rotulos <- paste0(sales$COUNTRY, "\n", porcentagem, "%")
cores_paises <- c("#4C78A8", "#F58518", "#54A24B", "#E45756", "#72B7B2", "#B279A2")
par(mar = c(1, 1, 3, 1))
pie(
sales$SALES,
labels = rotulos,
col = cores_paises,
main = "Porcentagem das vendas totais por país"
)
legend(
"topright",
legend = sales$COUNTRY,
fill = cores_paises
)InsectSprays traz a contagem de insetos em seis
inseticidas. outline = FALSE tira os outliers. Todas as
caixas usam a cor yellow.
boxplot(
count ~ spray,
data = InsectSprays,
outline = FALSE,
col = "yellow",
main = "Contagem de insetos por inseticida",
xlab = "Inseticida",
ylab = "Contagem de insetos"
)Cada arquivo é o monitoramento de uma carga da máquina virtual.
usedMemory mistura MB e GB: o número é separado da unidade
por expressão regular, GB vira megabyte multiplicando por 1024 e TB, se
aparecer, por 1.000.000. difftime() mede as horas desde a
primeira coleta, para o eixo do tempo ficar contínuo. No arquivo de
carga 0,5 algumas células repetem a data; essas linhas saem, senão o
relógio volta atrás.
memoria_para_mb <- function(texto) {
texto <- trimws(as.character(texto))
valor <- as.numeric(sub("^([0-9]*\\.?[0-9]+).*", "\\1", texto))
unidade <- toupper(sub("^([0-9]*\\.?[0-9]+)\\s*", "", texto))
ifelse(
grepl("^TB", unidade), valor * 1000000,
ifelse(
grepl("^GB", unidade), valor * 1024,
ifelse(grepl("^MB", unidade), valor, NA_real_)
)
)
}
preparar_monitoramento <- function(caminho) {
dados <- read.csv(caminho, stringsAsFactors = FALSE, check.names = FALSE)
uma_data <- !grepl(
"\\d{4}-\\d{2}-\\d{2}.*\\d{4}-\\d{2}-\\d{2}",
dados$currentTime
)
dados <- dados[uma_data, ]
instante <- as.POSIXct(
dados$currentTime,
format = "%Y-%m-%d %H:%M:%OS",
tz = "UTC"
)
data.frame(
horas = as.numeric(difftime(instante, min(instante), units = "hours")),
memoria_mb = memoria_para_mb(dados$usedMemory)
)
}
arquivos <- c(
"data/monitoringCloudData_NONE.csv",
"data/monitoringCloudData_0.1.csv",
"data/monitoringCloudData_0.5.csv",
"data/monitoringCloudData_1.csv"
)
titulos <- c(
"Memory Analysis (None Workload)",
"Memory Analysis (Workload of 0.1)",
"Memory Analysis (Workload of 0.5)",
"Memory Analysis (Workload of 1.0)"
)
layout(matrix(1:4, nrow = 2, byrow = TRUE))
par(mar = c(4.2, 4.2, 2.4, 1))
for (i in seq_along(arquivos)) {
serie <- preparar_monitoramento(arquivos[i])
plot(
serie$horas, serie$memoria_mb, type = "l",
main = titulos[i],
xlab = "Time (hour)",
ylab = "Used Memory (MB)"
)
}Entram só os títulos com um único país em country. País
vazio ou lista separada por vírgula fica de fora. O gráfico de pizza
mostra os dez países com mais títulos.
library(plotly)
netflix <- read.csv(
"data/netflix_titles.csv",
stringsAsFactors = FALSE,
encoding = "UTF-8"
)
pais <- trimws(netflix$country)
um_pais <- netflix[nzchar(pais) & !grepl(",", pais), ]
um_pais$country <- trimws(um_pais$country)
contagem_paises <- sort(table(um_pais$country), decreasing = TRUE)
top10 <- as.data.frame(contagem_paises[1:10])
names(top10) <- c("pais", "total")
plot_ly(
top10,
labels = ~pais,
values = ~total,
type = "pie",
textinfo = "label+percent",
sort = FALSE
) %>%
layout(title = "Os 10 países com mais conteúdo na Netflix")A mesma contagem da questão 7, agora em tabela. O cabeçalho tem fundo cinza e letra branca. País e total ficam centralizados.
plot_ly(
type = "table",
header = list(
values = c("País", "Total de conteúdos"),
align = c("center", "center"),
fill = list(color = "gray"),
font = list(color = "white", size = 14),
line = list(color = "white")
),
cells = list(
values = list(top10$pais, top10$total),
align = c("center", "center"),
fill = list(color = "white"),
font = list(color = "black", size = 13),
line = list(color = "#dddddd")
)
)A década é o bloco de XXX0 a XXX9: 2000 reúne 2000 a 2009. A linha azul é a das séries e a amarela é a dos filmes. Décadas sem título de um dos tipos entram com zero, para a linha não quebrar.
netflix$decada <- (netflix$release_year %/% 10) * 10
netflix$decada <- factor(
netflix$decada,
levels = seq(min(netflix$decada), max(netflix$decada), by = 10)
)
netflix$type <- factor(netflix$type, levels = c("TV Show", "Movie"))
por_decada <- as.data.frame(table(netflix$decada, netflix$type))
names(por_decada) <- c("decada", "tipo", "quantidade")
series <- por_decada[por_decada$tipo == "TV Show", ]
filmes <- por_decada[por_decada$tipo == "Movie", ]
plot_ly() %>%
add_trace(
data = series, x = ~decada, y = ~quantidade,
type = "scatter", mode = "lines+markers", name = "Séries",
line = list(color = "blue"), marker = list(color = "blue")
) %>%
add_trace(
data = filmes, x = ~decada, y = ~quantidade,
type = "scatter", mode = "lines+markers", name = "Filmes",
line = list(color = "gold"), marker = list(color = "gold")
) %>%
layout(
title = "Conteúdo da Netflix por década",
xaxis = list(title = "Década"),
yaxis = list(title = "Quantidade de conteúdo")
)Só filmes lançados de 2000 a 2010. Quando listed_in traz
vários gêneros, vale o primeiro. As barras ficam lado a lado para
Dramas, Action & Adventure e Comedies.
filmes_periodo <- netflix[
netflix$type == "Movie" &
netflix$release_year >= 2000 &
netflix$release_year <= 2010,
]
filmes_periodo$genero <- trimws(sub(",.*$", "", filmes_periodo$listed_in))
generos <- c("Dramas", "Action & Adventure", "Comedies")
filmes_periodo <- filmes_periodo[filmes_periodo$genero %in% generos, ]
filmes_periodo$genero <- factor(filmes_periodo$genero, levels = generos)
filmes_periodo$release_year <- factor(
filmes_periodo$release_year,
levels = 2000:2010
)
por_genero <- as.data.frame(table(
filmes_periodo$release_year,
filmes_periodo$genero
))
names(por_genero) <- c("ano", "genero", "quantidade")
rotulo <- c(
"Dramas" = "Drama",
"Action & Adventure" = "Ação e Aventura",
"Comedies" = "Comédia"
)
por_genero$genero <- unname(rotulo[as.character(por_genero$genero)])
plot_ly(
data = por_genero,
x = ~ano,
y = ~quantidade,
color = ~genero,
colors = c(
"Drama" = "#1f77b4",
"Ação e Aventura" = "#ff7f0e",
"Comédia" = "#2ca02c"
),
type = "bar"
) %>%
layout(
barmode = "group",
title = "Filmes lançados por gênero entre 2000 e 2010",
xaxis = list(title = "Ano de lançamento"),
yaxis = list(title = "Quantidade de lançamentos")
)