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(). Ver exemplos do uso da função layout() em:
https://stackoverflow.com/questions/38810854/how-to-use-layout-function-in-r e https://bookdown.org/ndphillips/YaRrr/arranging-plots-with-parmfrow-and-layout.html.
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)
x_axis_requests <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)
# Definir limites do eixo Y com base no valor máximo
ylim_max <- max(MRT_1F) # 517.14
ylim_min <- 0
# Plotar a primeira linha (1 Fog)
plot(x_axis_requests, MRT_1F,
type = "o", # 'o' para pontos e linhas (overplotted)
col = "gray40", # Cor da linha
pch = 4, # Símbolo 'x' (conforme legenda da imagem)
ylim = c(ylim_min, ylim_max + 50), # Limites do eixo Y (0 a ~570)
xlab = "Time between Things requests (seconds)",
ylab = "Response Time (sec.)",
main = "Response Time vs. Request Frequency")
# Adicionar as outras linhas ao gráfico
lines(x_axis_requests, MRT_3F, type="o", col="red", pch=25)
lines(x_axis_requests, MRT_5F, type="o", col="darkgoldenrod", pch=23) # (Usando 'darkgoldenrod' pois 'yellow' é muito claro)
lines(x_axis_requests, MRT_10F, type="o", col="blue", pch=24)
lines(x_axis_requests, MRT_15F, type="o", col="purple", pch=8)
lines(x_axis_requests, MRT_sem_F, type="o", col="darkgreen", pch=1)
legend("topright",
legend = c("1 Fog", "3 Fogs", "5 Fogs", "10 Fogs", "15 Fogs", "w/o Fog"),
col = c("gray40", "red", "darkgoldenrod", "blue", "purple", "darkgreen"),
pch = c(4, 25, 23, 24, 8, 1), # Símbolos correspondentes
lty = 1, # Tipo de linha (sólida)
bty = "n") # 'n' para sem caixa (no box)
# Cores solicitadas: [w/o Fog], [Fog]
colors_bar <- c("#E6E6E6", "#666666")
# Definir o layout para 3 linhas e 2 colunas.
# O gráfico 5 (último) ocupará as duas colunas da linha inferior.
layout(matrix(c(1, 2, 3, 4, 5, 5), nrow = 3, ncol = 2, byrow = TRUE))
# Ajustar margens para dar espaço aos rótulos (bottom, left, top, right)
par(mar = c(4.5, 5.0, 3.0, 1.5))
# --- Plot 1: 1 Fog ---
data_1F <- rbind(MRT_sem_F, MRT_1F)
# Definir limite Y dinamicamente baseado nos dados deste gráfico
ylim_1F <- c(0.1, max(data_1F, na.rm = TRUE) * 1.2)
barplot(data_1F,
beside = TRUE,
log = "y", # Escala logarítmica (requisito)
col = colors_bar, # Cores (requisito)
names.arg = x_axis_requests,
ylim = ylim_1F,
xlab = "Time between Things requests",
ylab = "Response time (s) [log scale]",
main = "Comparison: w/o Fog vs 1 Fog")
legend("topright", legend = c("w/o Fog", "1 Fog"), fill = colors_bar, bty = "n")
# --- Plot 2: 3 Fogs ---
data_3F <- rbind(MRT_sem_F, MRT_3F)
ylim_3F <- c(0.1, max(data_3F, na.rm = TRUE) * 1.2)
barplot(data_3F,
beside = TRUE,
log = "y",
col = colors_bar,
names.arg = x_axis_requests,
ylim = ylim_3F,
xlab = "Time between Things requests",
ylab = "Response time (s) [log scale]",
main = "Comparison: w/o Fog vs 3 Fogs")
legend("topright", legend = c("w/o Fog", "3 Fogs"), fill = colors_bar, bty = "n")
# --- Plot 3: 5 Fogs ---
data_5F <- rbind(MRT_sem_F, MRT_5F)
ylim_5F <- c(0.1, max(data_5F, na.rm = TRUE) * 1.2)
barplot(data_5F,
beside = TRUE,
log = "y",
col = colors_bar,
names.arg = x_axis_requests,
ylim = ylim_5F,
xlab = "Time between Things requests",
ylab = "Response time (s) [log scale]",
main = "Comparison: w/o Fog vs 5 Fogs")
legend("topright", legend = c("w/o Fog", "5 Fogs"), fill = colors_bar, bty = "n")
# --- Plot 4: 10 Fogs ---
data_10F <- rbind(MRT_sem_F, MRT_10F)
ylim_10F <- c(0.1, max(data_10F, na.rm = TRUE) * 1.2)
barplot(data_10F,
beside = TRUE,
log = "y",
col = colors_bar,
names.arg = x_axis_requests,
ylim = ylim_10F,
xlab = "Time between Things requests",
ylab = "Response time (s) [log scale]",
main = "Comparison: w/o Fog vs 10 Fogs")
legend("topright", legend = c("w/o Fog", "10 Fogs"), fill = colors_bar, bty = "n")
# --- Plot 5: 15 Fogs ---
data_15F <- rbind(MRT_sem_F, MRT_15F)
ylim_15F <- c(0.1, max(data_15F, na.rm = TRUE) * 1.2)
barplot(data_15F,
beside = TRUE,
log = "y",
col = colors_bar,
names.arg = x_axis_requests,
ylim = ylim_15F,
xlab = "Time between Things requests",
ylab = "Response time (s) [log scale]",
main = "Comparison: w/o Fog vs 15 Fogs")
legend("topright", legend = c("w/o Fog", "15 Fogs"), fill = colors_bar, bty = "n")
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.
# Carregar os pacotes necessários
library(ggplot2)
library(scales) # Para formatar o eixo Y como porcentagem
# --- 1. Preparação dos Dados ---
# Precisamos recriar a tabela no formato "longo" (tidy)
meal_data <- data.frame(
# Coluna de Preço: repetimos cada faixa de preço 3x (uma para cada classificação)
MealPrice = c(
rep("$10–19", 3), rep("$20–29", 3), rep("$30–39", 3), rep("$40–49", 3)
),
# Coluna de Classificação: repetimos a sequência para cada faixa de preço
QualityRating = c(
"Good", "Very Good", "Excellent",
"Good", "Very Good", "Excellent",
"Good", "Very Good", "Excellent",
"Good", "Very Good", "Excellent"
),
# Coluna de Porcentagem: inserimos os valores da tabela
Percentage = c(
53.8, 43.6, 2.6, # Valores para $10-19
33.9, 54.2, 11.9, # Valores para $20-29
2.6, 60.5, 36.8, # Valores para $30-39
0.0, 21.4, 78.6 # Valores para $40-49
)
)
# --- 2. Ordenação dos Fatores ---
# Garantir que o R plote as categorias na ordem correta, e não em ordem alfabética
# Definir a ordem correta para o eixo X
price_levels <- c("$10–19", "$20–29", "$30–39", "$40–49")
# Definir a ordem correta para o empilhamento (Good na base, Excellent no topo)
quality_levels <- c("Good", "Very Good", "Excellent")
# Aplicar os níveis aos fatores
meal_data$MealPrice <- factor(meal_data$MealPrice, levels = price_levels)
meal_data$QualityRating <- factor(meal_data$QualityRating, levels = quality_levels)
# --- 3. Criação do Gráfico ---
# O 'echo=FALSE' neste chunk esconde o código de plotagem, mostrando apenas o gráfico.
ggplot(meal_data, aes(x = MealPrice, y = Percentage, fill = QualityRating)) +
# geom_col() é usado para barras onde a altura já é um valor (nossa coluna Percentage)
geom_col(position = "stack") +
# --- 4. Títulos, Eixos e Legenda ---
labs(
title = "Relação entre Preço da Refeição e Classificação de Qualidade",
subtitle = "Distribuição % da classificação por faixa de preço",
x = "Faixa de Preço da Refeição (USD)",
y = "Porcentagem Total (%)",
fill = "Classificação:" # Este é o título da legenda
) +
# Formata o eixo Y para mostrar "50%" em vez de "50"
scale_y_continuous(labels = scales::percent_format(scale = 1)) +
# Aplica um tema visual limpo
theme_minimal() +
# Melhora a posição da legenda
theme(legend.position = "bottom")
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.
# 1. Filtrar os dados para o mês de Maio (Month == 5)
# O dataset 'airquality' já vem carregado no R
dados_maio <- subset(airquality, Month == 5)
# 2. Extrair a coluna de Temperatura (em Fahrenheit) de Maio
# (Neste dataset específico, não há NAs na temperatura em Maio)
temp_f <- dados_maio$Temp
# 3. Converter as temperaturas de Fahrenheit para Celsius
# Fórmula: °C = (°F - 32) / 1.8
temp_c <- (temp_f - 32) / 1.8
# 4. Gerar o histograma
# Usamos 'freq = FALSE' (ou 'prob = TRUE') para que o eixo Y
# represente a densidade, permitindo sobrepor a curva de densidade.
hist(temp_c,
freq = FALSE,
main = "Histograma da Temperatura em Maio (Celsius)", # Título
xlab = "Temperatura (°C)", # Rótulo Eixo X
ylab = "Densidade", # Rótulo Eixo Y
col = "lightblue", # Cor das barras
border = "gray") # Cor da borda das barras
# 5. Adicionar a curva de densidade
# 'lwd = 2' torna a linha um pouco mais espessa
lines(density(temp_c), col = "red", lwd = 2)
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)
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”.
# Gerar o boxplot
boxplot(count ~ spray,
data = InsectSprays,
main = "Eficácia de Inseticidas: Contagem de Insetos",
xlab = "Tipo de Inseticida (Spray)",
ylab = "Número de Insetos Contados",
col = "yellow",
outline = FALSE) # Este argumento remove a exibição dos outliers
# 1. Definir a função de pré-processamento de dados
process_monitoring_data <- function(df) {
# --- Processamento de Tempo (currentTime) ---
# Converter a coluna de string para o formato POSIXct (data/hora)
df$currentTime <- as.POSIXct(df$currentTime)
# Calcular o tempo decorrido em horas
# Encontrar o tempo inicial (primeiro registro)
start_time <- min(df$currentTime, na.rm = TRUE)
# Calcular a diferença em horas e converter para numérico
df$timeElapsed_hours <- as.numeric(
difftime(df$currentTime, start_time, units = "hours")
)
# --- Processamento de Memória (usedMemory) ---
# Extrair o valor numérico usando regex
# sub("([0-9.]+).*", "\\1", "247.09MB") -> "247.09"
values <- as.numeric(sub("([0-9.]+).*", "\\1", df$usedMemory))
# Extrair a unidade usando regex
# sub("[0-9.]+(.*)", "\\1", "247.09MB") -> "MB"
units <- sub("[0-9.]+(.*)", "\\1", df$usedMemory)
# Converter tudo para Megabytes (MB) com base nas regras fornecidas
# 1 TB = 1.000.000 MB
# 1 GB = 1024 MB
# 1 KB = 1/1024 MB
# 1 B = 1/(1024*1024) MB
df$usedMemory_MB <- ifelse(units == "GB", values * 1024,
ifelse(units == "TB", values * 1000000,
ifelse(units == "KB", values / 1024,
ifelse(units == "B", values / (1024 * 1024),
values # O padrão já é MB
)
)
)
)
return(df)
}
# 2. Carregar e processar os quatro arquivos CSV
df_0.1 <- process_monitoring_data(read.csv("monitoringCloudData_0.1.csv"))
df_0.5 <- process_monitoring_data(read.csv("monitoringCloudData_0.5.csv"))
df_1 <- process_monitoring_data(read.csv("monitoringCloudData_1.csv"))
df_NONE <- process_monitoring_data(read.csv("monitoringCloudData_NONE.csv"))
# layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
# | 1 | 2 |
# | 3 | 4 |
layout(matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE))
par(mar = c(4.1, 4.1, 3.1, 1.1)) # Ajustar margens (bottom, left, top, right)
common_xlab <- "Tempo Decorrido (horas)"
common_ylab <- "Memória Usada (MB)"
# Gráfico 1: 0.1
plot(df_0.1$timeElapsed_hours, df_0.1$usedMemory_MB,
type = 'l', # 'l' para gráfico de linha
col = "blue",
main = "Monitoramento 0.1",
xlab = common_xlab,
ylab = common_ylab)
# Gráfico 2: 0.5
plot(df_0.5$timeElapsed_hours, df_0.5$usedMemory_MB,
type = 'l',
col = "red",
main = "Monitoramento 0.5",
xlab = common_xlab,
ylab = common_ylab)
# Gráfico 3: 1
plot(df_1$timeElapsed_hours, df_1$usedMemory_MB,
type = 'l',
col = "darkgreen",
main = "Monitoramento 1",
xlab = common_xlab,
ylab = common_ylab)
# Gráfico 4: NONE
plot(df_NONE$timeElapsed_hours, df_NONE$usedMemory_MB,
type = 'l',
col = "purple",
main = "Monitoramento NONE",
xlab = common_xlab,
ylab = common_ylab)
Para os exercícios a seguir utilizaremos o dataset Netflix Movies and TV Shows. Essa base de dados reúne os filmes e séries disponíveis na Netflix em 2019, e se divide em algumas colunas que descrevem o tipo do conteúdo (série ou filme), o país de origem, o ano de lançamento, o gênero, entre outros.
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.
library(readr)
##
## Attaching package: 'readr'
## The following object is masked from 'package:scales':
##
## col_factor
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl (1): release_year
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Filtrar, Contar e Selecionar os Top 10
top_10_countries <- netflix_data %>%
# Remover linhas onde o país é nulo (NA)
filter(!is.na(country)) %>%
# Filtrar para incluir apenas linhas SEM vírgula na coluna 'country'
# Isso garante que apenas conteúdos com um único país de origem sejam contados
filter(!grepl(",", country)) %>%
# Contar as ocorrências de cada país e ordenar em ordem decrescente
count(country, sort = TRUE, name = "count") %>%
# Pegar apenas as 10 primeiras linhas (os 10 principais)
slice_head(n = 10)
# Exibir os dados processados (opcional)
print(top_10_countries)
## # A tibble: 10 × 2
## country count
## <chr> <int>
## 1 United States 2555
## 2 India 923
## 3 United Kingdom 397
## 4 Japan 226
## 5 South Korea 183
## 6 Canada 177
## 7 Spain 134
## 8 France 115
## 9 Egypt 101
## 10 Mexico 100
fig <- plot_ly(
data = top_10_countries,
labels = ~country, # Coluna para os rótulos das fatias
values = ~count, # Coluna para os valores (tamanho) das fatias
type = 'pie', # Tipo de gráfico
textposition = 'inside', # Posição do texto (inside, outside)
textinfo = 'percent+label', # Mostrar porcentagem e o rótulo
hoverinfo = 'text', # Informação ao passar o mouse
text = ~paste(count, "títulos"), # Texto customizado para o hover
marker = list(line = list(color = '#FFFFFF', width = 1)) # Linha branca entre as fatias
)
# 4. Adicionar layout e título
fig <- fig %>% layout(
title = "Top 10 Países com Mais Conteúdo na Netflix (Origem Única)",
# Esconder eixos que não são necessários para gráficos de pizza
xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE)
)
# 5. Exibir o gráfico
fig
netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl (1): release_year
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Filtrar, Contar e Selecionar os Top 10
top_10_countries <- netflix_data %>%
filter(!is.na(country)) %>%
filter(!grepl(",", country)) %>%
count(country, sort = TRUE, name = "count") %>%
slice_head(n = 10)
# --- Visualização: Tabela com Plotly ---
fig <- plot_ly(
type = 'table', # Define o tipo de gráfico como 'tabela'
# --- Estilização do Cabeçalho ---
header = list(
# Define os nomes das colunas
values = c("<b>País</b>", "<b>Total de conteúdos</b>"),
# Alinhamento do texto
align = "center",
# Cor de preenchimento (fundo)
fill = list(color = "grey"),
# Estilo da fonte
font = list(color = "white", size = 12)
),
# --- Estilização das Células (Corpo da Tabela) ---
cells = list(
# Passa os dados das colunas
# É importante que a ordem corresponda ao cabeçalho
values = list(top_10_countries$country, top_10_countries$count),
# Alinhamento do texto
align = "center",
# Cor de preenchimento (vamos usar um cinza claro para linhas alternadas)
fill = list(color = c("#F5F5F5", "white")),
font = list(size = 12)
)
)
# Adiciona um título ao layout
fig <- fig %>% layout(
title = "Top 10 Países com Mais Conteúdo na Netflix (Origem Única)"
)
# Exibe a tabela
fig
# 1. Carregar o conjunto de dados
netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl (1): release_year
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Processar os dados
content_by_decade <- netflix_data %>%
# Remove linhas onde o ano de lançamento é nulo
filter(!is.na(release_year)) %>%
# 3. Criar a coluna da década
# Esta fórmula agrupa os anos (ex: 1995 -> 1990, 2003 -> 2000)
mutate(decade_start = floor(release_year / 10) * 10) %>%
# 4. Contar o conteúdo por década e tipo
count(decade_start, type, name = "count") %>%
# Criar um rótulo amigável para a década (ex: "1990s")
mutate(decade_label = paste0(decade_start, "s")) %>%
mutate(tipo_traduzido = ifelse(type == "Movie", "Filmes", "Séries"))
fig <- plot_ly(
data = content_by_decade,
x = ~decade_label, # Eixo X: Rótulo da década
y = ~count, # Eixo Y: Quantidade
color = ~tipo_traduzido, # Agrupar linhas por tipo (Filmes, Séries)
# Define as cores específicas para cada grupo
colors = c("Filmes" = "gold", "Séries" = "blue"),
type = 'scatter', # Tipo de gráfico
mode = 'lines+markers', # Modo: linhas E pontos (marcadores)
# Configurar os marcadores (pontos)
marker = list(size = 8, opacity = 0.8),
# Configurar o texto do hover
hoverinfo = 'text',
text = ~paste0(
"<b>", tipo_traduzido, "</b><br>",
"Década: ", decade_label, "<br>",
"Total: ", count
)
)
# 7. Adicionar layout e títulos
fig <- fig %>% layout(
title = "Quantidade de Conteúdo Netflix por Década de Lançamento",
xaxis = list(
title = "Década de Lançamento",
# Ordena o eixo X categoricamente pela ordem dos dados (já ordenados)
# Isso evita que "2000s" venha antes de "1990s" se houver falhas
categoryorder = "array",
categoryarray = ~decade_label
),
yaxis = list(title = "Quantidade de Conteúdos"),
hovermode = "x unified" # Melhora a experiência do hover
)
# 8. Exibir o gráfico
fig
# 1. Carregar o conjunto de dados
netflix_data <- read_csv("netflix_titles.csv")
## Rows: 7787 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (11): show_id, type, title, director, cast, country, date_added, rating,...
## dbl (1): release_year
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Preparar os dados para o gráfico
genre_data_by_year <- netflix_data %>%
# Filtrar por tipo (apenas filmes) e pelo intervalo de anos
filter(type == "Movie") %>%
filter(release_year >= 2000 & release_year <= 2010) %>%
# Remover linhas onde o gênero (listed_in) é nulo
filter(!is.na(listed_in)) %>%
# 3. Extrair APENAS o primeiro gênero
# A função sub() substitui a primeira vírgula e tudo depois dela por nada
mutate(primary_genre = sub(",.*", "", listed_in)) %>%
# 4. Filtrar APENAS para os três gêneros de interesse
filter(primary_genre %in% c("Dramas", "Action & Adventure", "Comedies")) %>%
# 5. Agrupar e contar por ano e gênero
count(release_year, primary_genre, name = "count") %>%
# Converter o ano em fator para que o Plotly o trate como categoria
# Isso garante que todos os anos sejam mostrados corretamente no eixo X
mutate(year_factor = as.factor(release_year))
fig <- plot_ly(
data = genre_data_by_year,
x = ~year_factor, # Eixo X: O ano (como categoria)
y = ~count, # Eixo Y: A contagem
color = ~primary_genre, # Agrupar/colorir por gênero
type = 'bar', # Tipo de gráfico
# Configurar o texto do hover
hoverinfo = 'text',
text = ~paste0(
"<b>", primary_genre, "</b><br>",
"Ano: ", release_year, "<br>",
"Total: ", count
)
)
# 7. Adicionar layout e títulos
fig <- fig %>% layout(
title = "Filmes Lançados por Gênero e Ano (2000-2010)",
xaxis = list(title = "Ano de Lançamento"),
yaxis = list(title = "Quantidade de Filmes"),
# Esta é a configuração chave para barras "lado-a-lado"
barmode = 'group',
# Adiciona um título à legenda
legend = list(title = list(text = "<b>Gênero</b>"))
)
# 8. Exibir o gráfico
fig