O propósito desse documento é ensinar a mostrar graficamente a representatividade de blocos de partidos políticos no Senado. Também pretende-se calcular o poder de coalizão utilizando o índice de Shapley-Shubik.
library(GameTheory)
library(ggplot2)
library(tibble)
library(RColorBrewer)
library(waffle)
# Valores e cálculo das porcentagens
assentos <- c(26, 17, 15, 12, 11)
blocos <- c("Parlamentar democrático", "Resistência democrática",
"Democracia", "Vanguarda", "Pelo Brasil")
# Total
total_assentos <- sum(assentos)
# Criar vetor nomeado com % no nome
blocos_pct <- paste0(
blocos,
" (", sprintf("%.1f", assentos / total_assentos * 100), "%)"
)
# Montar vetor final com nomes já contendo a %:
dados_waffle <- setNames(assentos, blocos_pct)
# Cores opcionais
cores <- c("#4E79A7", "#F28E2B", "#E15759", "#76B7B2", "#59A14F")
# Plot
waffle(dados_waffle,
rows = 9,
size = 0.5,
colors = cores,
title = "Distribuição dos Assentos por Bloco",
xlab = "1 quadrado = 1 assento") +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
legend.title = element_blank(),
legend.text = element_text(size = 10),
legend.position = "right"
)
# Pesos dos blocos
assentos <- c(26, 17, 15, 12, 11)
# Nomes dos blocos
blocos <- c("Parlamentar democrático", "Resistência democrática",
"Democracia", "Vanguarda", "Pelo Brasil")
# Quota necessária para vitória (maioria simples)
quota <- 41
# Cálculo do poder de Shapley-Shubik
senado_simples <- ShapleyShubik(quota, assentos, blocos)
# Extrair a linha "Shapley-Shubik"
shapley_row_simples <- senado_simples$Results["Shapley-Shubik", ]
# Criar data frame com blocos e valores
df_shapley_simples <- tibble::tibble(
Bloco_original = colnames(senado_simples$Results),
Shapley = as.numeric(shapley_row_simples)
)
# Criar coluna com quebras de linha
df_shapley_simples$Bloco <- gsub(" ", "\n", df_shapley_simples$Bloco_original)
# Reordenar por valor decrescente
df_shapley_simples$Bloco <- factor(df_shapley_simples$Bloco,
levels = df_shapley_simples$Bloco[order(-df_shapley_simples$Shapley)])
# Gráfico para maioria simples
ggplot(df_shapley_simples, aes(x = Bloco, y = Shapley, fill = Bloco)) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = round(Shapley, 3)),
vjust = -0.3, size = 3) +
theme_minimal() +
labs(
x = NULL,
y = NULL,
title = "Poder de coalizão no Senado - Maioria Simples (41 votos)"
) +
theme(
plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(size = 10),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "none"
) +
scale_fill_brewer(palette = "Greens")
# Dados
assentos <- c(26, 17, 15, 12, 11)
blocos <- c("Parlamentar democrático", "Resistência democrática",
"Democracia", "Vanguarda", "Pelo Brasil")
quota <- 49
# Cálculo do índice Shapley-Shubik
senado2025 <- ShapleyShubik(quota, assentos, blocos)
# Extrair resultados
shapley_row <- senado2025$Results["Shapley-Shubik", ]
# Data frame para o gráfico
df_shapley <- tibble(
Bloco_original = colnames(senado2025$Results),
Shapley = as.numeric(shapley_row)
)
# Quebra de linha nos nomes e ordenação
df_shapley$Bloco <- gsub(" ", "\n", df_shapley$Bloco_original)
df_shapley$Bloco <- factor(df_shapley$Bloco,
levels = df_shapley$Bloco[order(-df_shapley$Shapley)])
# Gráfico
ggplot(df_shapley, aes(x = Bloco, y = Shapley, fill = Bloco)) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = round(Shapley, 3)),
vjust = -0.3, size = 3) +
theme_minimal() +
labs(
x = NULL,
y = NULL,
title = "Poder de coalizão no Senado Brasileiro - 49 votos"
) +
theme(
plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(size = 10),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "none"
) +
scale_fill_brewer(palette = "Reds")
# Dados
assentos <- c(26, 17, 15, 12, 11)
blocos <- c("Parlamentar democrático", "Resistência democrática",
"Democracia", "Vanguarda", "Pelo Brasil")
quota <- 54
# Cálculo do índice Shapley-Shubik
senado2025 <- ShapleyShubik(quota, assentos, blocos)
# Extrair resultados
shapley_row <- senado2025$Results["Shapley-Shubik", ]
# Data frame para o gráfico
df_shapley <- tibble(
Bloco_original = colnames(senado2025$Results),
Shapley = as.numeric(shapley_row)
)
# Quebra de linha nos nomes e ordenação
df_shapley$Bloco <- gsub(" ", "\n", df_shapley$Bloco_original)
df_shapley$Bloco <- factor(df_shapley$Bloco,
levels = df_shapley$Bloco[order(-df_shapley$Shapley)])
# Gráfico
ggplot(df_shapley, aes(x = Bloco, y = Shapley, fill = Bloco)) +
geom_bar(stat = "identity", color = "black") +
geom_text(aes(label = round(Shapley, 3)),
vjust = -0.3, size = 3) +
theme_minimal() +
labs(
x = NULL,
y = NULL,
title = "Poder de coalizão no Senado Brasileiro - 54 votos"
) +
theme(
plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(size = 10),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "none"
) +
scale_fill_brewer(palette = "Blues")