Instalação e carregamento de bibliotecas.
install.packages("plotly")
## Instalando pacote em '/home/renan-beserra/R/x86_64-pc-linux-gnu-library/4.5'
## (como 'lib' não foi especificado)
install.packages("dplyr")
## Instalando pacote em '/home/renan-beserra/R/x86_64-pc-linux-gnu-library/4.5'
## (como 'lib' não foi especificado)
install.packages("stringr")
## Instalando pacote em '/home/renan-beserra/R/x86_64-pc-linux-gnu-library/4.5'
## (como 'lib' não foi especificado)
library(plotly)
## Carregando pacotes exigidos: ggplot2
##
## Anexando pacote: 'plotly'
## O seguinte objeto é mascarado por 'package:ggplot2':
##
## last_plot
## O seguinte objeto é mascarado por 'package:stats':
##
## filter
## O seguinte objeto é mascarado por 'package:graphics':
##
## layout
library(dplyr)
##
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
Use os dados abaixo para gerar os gráficos. Para o segundo gráfico (barras), use a escala logarítmica (log = “y”) e as seguintes cores: “#E6E6E6”, “#666666”. Além disso, os gráficos podem ser organizados com a função layout().
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)
# Gráfico 1
plot(clock, MRT_1F, type = "o", col = "black", pch = 4, ylim = c(0, max(MRT_1F)),
xlab = "Time between Things requests (seconds)",
ylab = "Response Time (sec.)",
main = "Tempo de Resposta vs Intervalo de Requisições")
lines(clock, MRT_3F, type = "o", col = "yellow", pch = 11)
lines(clock, MRT_5F, type = "o", col = "red", pch = 1)
lines(clock, MRT_10F, type = "o", col = "blue", pch = 2)
lines(clock, MRT_15F, type = "o", col = "purple", pch = 5)
lines(clock, MRT_sem_F, type = "o", col = "green", pch = 4)
legend("topright",
legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
col = c("black", "yellow", "red", "blue", "purple", "green"),
pch = c(4, 11, 1, 2, 5, 4),
lwd = 1)
# Gráfico 2
dados_1F <- matrix(c(MRT_sem_F, MRT_1F), nrow = 2, ncol = 7, byrow = TRUE)
dados_3F <- matrix(c(MRT_sem_F, MRT_3F), nrow = 2, ncol = 7, byrow = TRUE)
dados_5F <- matrix(c(MRT_sem_F, MRT_5F), nrow = 2, ncol = 7, byrow = TRUE)
dados_10F <- matrix(c(MRT_sem_F, MRT_10F), nrow = 2, ncol = 7, byrow = TRUE)
dados_15F <- matrix(c(MRT_sem_F, MRT_15F), nrow = 2, ncol = 7, byrow = TRUE)
par(mfrow = c(3, 2))
criar_barplot <- function(dados, titulo) {
barplot(dados, beside = TRUE, col = c("#E6E6E6", "#666666"),
names.arg = clock, log = "y",
xlab = "Time between Things requests (seconds)",
ylab = "Response time (s)")
legend("topright", legend = c("w/o Fog", titulo),
fill = c("#E6E6E6", "#666666"))
}
criar_barplot(dados_1F, "1 Fog")
criar_barplot(dados_3F, "3 Fogs")
criar_barplot(dados_5F, "5 Fogs")
criar_barplot(dados_10F, "10 Fogs")
criar_barplot(dados_15F, "15 Fogs")
par(mfrow = c(1, 1))
Para a tabela abaixo que classifica a qualidade de refeição de acordo com categorias de preços crie um gráfico de barras empilhadas. Também adicione título, nomes de eixos e legenda.
cores <- rainbow(3)
preco_refeicao <- c("$10-19", "$20-29", "$30-39", "$40-49")
percentual <- matrix(c(53.8, 33.9, 2.6, 0, 43.6, 54.2, 60.5, 21.4, 2.6, 11.9, 36.8, 78.6),
nrow = 3, ncol = 4, byrow = T)
qualidade <- c("Good", "Very Good", "Excellent")
barplot(percentual, names.arg = preco_refeicao, col = cores, main = "Qualidade de refeição de acordo com categorias de preços",
xlab = "Preço da Refeição", ylab = "Percentual (%)", ylim = c(0, 150))
legend("topleft", pch = 15, col = cores, legend = qualidade, title = "Qualidade da Refeição")
Faça o histograma das temperaturas do mês de maio do dataset airquality. No entanto, primeiro converta as temperaturas para graus Celsius através da expressão °C = (°F − 32) / 1.8. Após isso, gere o histograma. Também adicione título, nomes de eixos, cor e curva de densidade.
data(airquality)
may_data <- airquality[airquality$Month == 5, ]
may_data$Temp_C <- (may_data$Temp - 32) / 1.8
hist(may_data$Temp_C,
col = "lightblue",
main = "Histograma das Temperaturas em Maio (°C)",
xlab = "Temperatura (°C)",
ylab = "Frequência",
probability = TRUE)
densidade <- density(may_data$Temp_C, na.rm = TRUE)
lines(densidade, col = "red", lwd = 2)
legend("topright",
legend = "Curva de Densidade",
col = "red",
lwd = 2,
bty = "n")
Crie um gráfico de pizza com a porcentagem da tabela total de vendas por país. Use o dataset abaixo. Inclua a porcentagem de cada fatia, as cores das fatias e o nome do gráfico. Adicionalmente, use o comando legend() para incluir a legenda do gráfico.
sales <- read.table("https://training-course-material.com/images/8/8f/Sales.txt", header=TRUE)
porcentagens <- round(sales$SALES / sum(sales$SALES) * 100)
labels <- paste(sales$COUNTRY, "\n", porcentagens, "%", sep = "")
cores <- rainbow(length(sales$COUNTRY))
pie(sales$SALES,
labels = labels,
col = cores,
main = "Distribuição de Vendas por País",
cex = 0.8)
legend("topright",
legend = sales$COUNTRY,
fill = cores,
cex = 0.7,
title = "Países")
Utilize os dados de contagens de insetos em unidades experimentais agrícolas tratados com inseticidas diferentes disponíveis no R em InsectSprays e construa um boxplot sem a presença dos outliers para os 6 tipos de inseticidas. Coloque título e nomes de eixos adequados. Além disso, as caixas devem ser preenchidas com a cor “yellow”.
data(InsectSprays)
boxplot(count ~ spray, data = InsectSprays,
ylab = "Quantidade",
xlab = "Categoria",
main = "Contagens de Insetos por Tipo de Inseticida",
col = "yellow",
outline = FALSE)
Gere os gráficos abaixo a partir dos seguintes dados: monitoringCloudData_0.1.csv, monitoringCloudData_0.5.csv, monitoringCloudData_1.csv e monitoringCloudData_NONE.csv. Esses dados consistem de informações de monitoramento dos recursos de uma máquina virtual. Basicamente, é necessário gerar gráficos de linha do tempo de coleta dos recursos (currentTime) em relação a memória usada (usedMemory). Porém, é necessário ajustar a coluna “currentTime” para que o tempo fique contínuo e a coluna “usedMemory” para que todas as informações fiquem megabytes. Por fim, use a função layout() para organizar os gráficos.
convert_memory_to_mb <- function(memory_string) {
s <- as.character(memory_string)
value_str <- sub("([0-9.]+)([A-Z]+)", "\\1", s, ignore.case = TRUE)
unit_str <- sub("([0-9.]+)([A-Z]+)", "\\2", s, ignore.case = TRUE)
value <- as.numeric(value_str)
if (is.na(value) || unit_str == "" || value_str == s) {
warning(paste("Não foi possível analisar a string de memória:", memory_string))
return(NA)
}
unit <- toupper(unit_str)
if (unit == "MB") {
return(value)
} else if (unit == "GB") {
return(value * 1024)
} else if (unit == "TB") {
return(value * 1000000)
} else if (unit == "KB") {
return(value / 1024)
} else {
warning(paste("Unidade de memória desconhecida:", unit, "na string:", memory_string))
return(NA)
}
}
file_info <- list(
list(path = "monitoringCloudData_NONE.csv", title = "Memory Analysis (None Workload)"),
list(path = "monitoringCloudData_0.1.csv", title = "Memory Analysis (Workload of 0.1)"),
list(path = "monitoringCloudData_0.5.csv", title = "Memory Analysis (Workload of 0.5)"),
list(path = "monitoringCloudData_1.csv", title = "Memory Analysis (Workload of 1.0)")
)
layout(matrix(1:4, nrow = 2, byrow = TRUE))
for (info in file_info) {
data_orig <- tryCatch({
read.csv(info$path, stringsAsFactors = FALSE)
}, error = function(e) {
warning(paste("Erro ao ler o arquivo:", info$path, "-", e$message))
return(NULL)
})
data <- data_orig
data$currentTime <- suppressWarnings(as.POSIXct(data$currentTime))
data <- data[!is.na(data$currentTime), ]
if (nrow(data) == 0) {
plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1),
xlab = "Tempo (horas)", ylab = "Memória Usada (MB)",
main = paste(info$title, "\n(Sem dados de tempo válidos)"))
next
}
data <- data[order(data$currentTime), ]
data$time_continuous_hours <- as.numeric(difftime(data$currentTime, data$currentTime[1], units = "hours"))
data$usedMemory_MB <- sapply(data$usedMemory, convert_memory_to_mb)
valid_plot_data <- nrow(data) > 0 &&
!all(is.na(data$time_continuous_hours)) &&
any(!is.na(data$usedMemory_MB))
if (valid_plot_data) {
x_range <- range(data$time_continuous_hours, na.rm = TRUE)
y_range <- range(data$usedMemory_MB, na.rm = TRUE)
if (!all(is.finite(x_range))) x_range <- c(0, 1)
if (!all(is.finite(y_range))) y_range <- c(0, 1)
if (y_range[1] == y_range[2]) {
y_range <- y_range + c(-max(1, abs(y_range[1]*0.1)), max(1, abs(y_range[1]*0.1)))
}
plot(data$time_continuous_hours, data$usedMemory_MB,
type = "l",
xlab = "Time (hour)",
ylab = "Used Memory (MB)",
main = info$title,
col = "black",
lwd = 1,
xlim = x_range,
ylim = y_range)
grid()
} else {
plot(0, 0, type = "n", xlim = c(0, 1), ylim = c(0, 1),
xlab = "Time (hour)", ylab = "Used Memory (MB)",
main = paste(info$title, "\n(Sem dados para plotar)"))
}
}
par(mfrow = c(1, 1))
Filtrando os conteúdos com apenas UM país de origem (coluna “country”), utilize o Plotly para obter um gráfico de pizza dos 10 países com mais conteúdo na plataforma.
netflix <- read.csv("netflix_titles.csv")
netflix_single_country <- netflix %>%
filter(!is.na(country)) %>%
mutate(country = strsplit(as.character(country), ", ")) %>%
filter(lengths(country) == 1) %>%
mutate(country = unlist(country))
top_countries <- netflix_single_country %>%
count(country, sort = TRUE) %>%
head(10)
fig <- plot_ly(top_countries,
labels = ~country,
values = ~n,
type = 'pie',
textinfo = 'label+percent',
insidetextorientation = 'radial',
marker = list(colors = rainbow(10)),
hoverinfo = 'label+value+percent')
fig
Considerando os 10 países descritos na questão anterior, utilize o Plotly para obter uma tabela com as colunas “País” e “Total de conteúdos”. Para tal tabela, é necessário que o cabeçalho esteja com o fundo da célula cinza e a letra em branco, e que todos os textos das células estejam centralizados.
netflix <- read.csv("netflix_titles.csv")
netflix_single_country <- netflix %>%
filter(!is.na(country)) %>%
mutate(country = strsplit(as.character(country), ", ")) %>%
filter(lengths(country) == 1) %>%
mutate(country = unlist(country))
top_countries <- netflix_single_country %>%
count(country, name = "Total de conteúdos", sort = TRUE) %>%
head(10) %>%
rename(País = country)
fig <- plot_ly(
type = 'table',
header = list(
values = c("<b>País</b>", "<b>Total de conteúdos</b>"),
align = c('center', 'center'),
fill = list(color = 'gray'),
font = list(color = 'white', size = 14)
),
cells = list(
values = rbind(top_countries$País, top_countries$`Total de conteúdos`),
align = c('center', 'center'),
font = list(size = 12)
)
)
fig
Utilizando o Plotly, obtenha um gráfico de linha com quantidade de conteúdo por década do Netflix, onde o eixo X representa as décadas e o eixo Y a quantidade de conteúdo disponível na plataforma (coluna “release_year”). Use uma linha azul para representar as séries e uma linha amarela representando os filmes. (Obs: considerar como década o período que compreende os anos de XXX0 à XXX9, por exemplo, 2000 à 2009).
netflix <- read.csv("netflix_titles.csv")
netflix <- netflix %>%
mutate(decade = floor(release_year/10)*10) %>%
filter(!is.na(decade))
conteudo_decada <- netflix %>%
group_by(decade, type) %>%
summarise(qtd = n(), .groups = 'drop')
filmes <- conteudo_decada %>% filter(type == "Movie")
series <- conteudo_decada %>% filter(type == "TV Show")
fig <- plot_ly() %>%
# Adicionar linha para séries (azul)
add_trace(data = series,
x = ~decade,
y = ~qtd,
type = 'scatter',
mode = 'lines+markers',
name = 'TV Series',
line = list(color = 'blue', width = 3),
marker = list(color = 'blue', size = 8)) %>%
add_trace(data = filmes,
x = ~decade,
y = ~qtd,
type = 'scatter',
mode = 'lines+markers',
name = 'Movies',
line = list(color = 'orange', width = 3),
marker = list(color = 'orange', size = 8)) %>%
layout(xaxis = list(title = "Década",
tickvals = seq(1940, 2020, by = 20)),
yaxis = list(title = "Qnd. Conteúdo"),
legend = list(
x = 1,
y = 1,
xanchor = "right",
yanchor = "top"
)
)
fig
Utilizando o Plotly, obtenha um gráfico que representa a quantidade de filmes lançados de um determinado gênero entre os anos de 2000 e 2010. Este gráfico deve ser de barras lado-a-lado, com cada barra representando a quantidade de filmes dos gêneros “Dramas”, “Action & Adventure” e “Comedies” lançados naquele determinado ano. (Obs: Para filmes com múltiplos gêneros, considerar apenas o primeiro descrito na coluna “listed_in”).
netflix <- read.csv("netflix_titles.csv")
dados_filtrados <- netflix %>%
filter(type == "Movie") %>%
filter(release_year >= 2000 & release_year <= 2010) %>%
mutate(genero_principal = str_split(listed_in, ", ", simplify = TRUE)[,1]) %>%
filter(genero_principal %in% c("Dramas", "Action & Adventure", "Comedies")) %>%
group_by(release_year, genero_principal) %>%
summarise(quantidade = n(), .groups = 'drop')
fig <- plot_ly(dados_filtrados,
x = ~release_year,
y = ~quantidade,
color = ~genero_principal,
type = 'bar',
colors = c("Dramas" = "#1f77b4",
"Action & Adventure" = "#ff7f0e",
"Comedies" = "#2ca02c")) %>%
layout(title = "Filmes na Netflix por Gênero (2000-2010)",
xaxis = list(title = "Ano de Lançamento",
dtick = 1),
yaxis = list(title = "Quantidade de Filmes"),
barmode = 'group',
legend = list(title = list(text = '<b>Gênero</b>'),
x = 1, y = 1))
fig