Motivação Link para o cabeçalho
Fazia um tempo em que eu queria trabalhar com paletas de cores de forma automática. Eu queria encontrar quais as cores presentes em uma imagem através de técnicas estatísticas de agrupamento de dados.
Ao pensar em bandeiras de países, encontrei uma maneira de fazer isso com menos complicações, já que este tipo de imagem possui, naturalmente, poucas cores. E isso, claramente, facilita meu trabalho.
A Lógica por Trás Link para o cabeçalho
Primeiro carrego todos os pacotes que necessito:
library(colordistance)
library(countcolors)
library(tidyverse)
library(ggimage)
library(cowplot)
theme_set(theme_map())
library(patchwork)
Em seguida, crio uma função chamada country_flag_pie_chart, que possui três argumentos:
country: nome do arquivo .png com a bandeira que desejo transformar em gráfico de pizza, colocada na pastaflags/em meu computadorn_colours: número de cores que a bandeira possuititulo: o título que desejo para o meu gráfico que, em geral, é o nome do país
O que a função faz é encontrar quantos pixels de cada uma das n_colours estão presentes na imagem. A partir disso, calcula a percentagem de cada um e cria um gráfico de pizza com elas, ordenando da mais comum para a menos comum.
country_flag_pie_chart <- function(country, n_colours, titulo) {
kmeans.clusters <- getKMeanColors(paste0("flags/", country, ".png"), n = n_colours, plotting = FALSE)
df <-
extractClusters(kmeans.clusters) |>
select(Pct) |>
arrange(Pct) |>
mutate(group = letters[1:length(Pct)])
colours <-
extractClusters(kmeans.clusters) |>
left_join(df) |>
arrange(group)
colour_scale <- 0
for (j in 1:nrow(colours)) {
colour_scale[j] <- rgb(colours[j, ], maxColorValue = 1)
}
pizza <-
ggplot(df, aes(x = "", y = Pct, fill = group)) +
geom_col(colour = "grey70", linewidth = 0.75) +
coord_polar(theta = "y") +
theme(legend.position = "none", plot.title = element_text(hjust = 0.5)) +
scale_fill_manual(values = colour_scale) #+
#labs(title = str_to_title(country))
flag <-
ggplot(df, aes(x = "", y = Pct, fill = group)) +
geom_image(data = tibble(Pct = 20, group = 1),
aes(image = paste0("flags/", country, ".png")),
size = 1)
flag + pizza +
theme(plot.title = element_text(hjust = 0.5)) +
plot_annotation(
title = titulo,
theme = theme(plot.title = element_text(hjust = 0.5))
)
}
O resultado final para alguns países escolhidos é o seguinte:
country_flag_pie_chart("brazil", 4, "Brasil")
country_flag_pie_chart("argentina", 4, "Argentina")
country_flag_pie_chart("italy", 3, "Itália")
country_flag_pie_chart("us", 3, "Estados Unidos")
country_flag_pie_chart("italy", 3, "Itália")
country_flag_pie_chart("bhutan", 3, "Butão")
country_flag_pie_chart("seychelles", 5, "Seychelles")