Vamos agrupar "bolhas" em um gráfico sem área de sobreposição.
A embalagem circular é uma boa ideia para traçar bolhas economizando espaço.
Precisamos calcular a posição e o tamanho de cada bolha.
O pacote circlify realiza este cálculo.
Instale o pacote circlify com o PIP:
pip install circlify
Uma desvantagem do empacotamento circular é que é difícil descobrir a diferença entre bolhas que têm tamanhos próximos.
Isso pode ser resolvido rotulando cada bolha com seu valor.
Analise o código observando o gráfico produzido.
Rode o código no programa-interpretador do Python ou no Jupyter-Lab e veja o gráfico gerado.
Baixe o arquivo-csv de países aqui
import matplotlib.pyplot as plt
import pandas as pd
import circlify as cfy
#
def selecionar_cor(name, number):
import seaborn as sns
pal = list(sns.color_palette(palette=name, n_colors=number).as_hex())
return pal
#
df = pd.read_csv("dados_paises.csv",encoding="UTF-8")
df_len = len(df)
#
pal_vi = selecionar_cor("viridis_r",df_len)
#
df_s = df.sort_values(by="Emissão",ascending=False)
df_s.head(9)
#
# Calcular as posições dos círculos:
#
circulos = cfy.circlify(
df_s["Emissão"].tolist(),
show_enclosure=False,
target_enclosure=cfy.Circle(x=0, y=0))
#
circulos.reverse()
#
fig, ax = plt.subplots(figsize=(14, 14), facecolor="white")
ax.axis("off")
lim = max(max(abs(circulo.x)+circulo.r, abs(circulo.y)+circulo.r,) for circulo in circulos)
plt.xlim(-lim, lim)
plt.ylim(-lim, lim)
#
# imprimir círculos
#
for circulo, rotulo, emi, cor in zip(circulos, df_s["País"], df_s["Emissão"], pal_vi):
x, y, r = circulo
ax.add_patch(plt.Circle((x, y), r, alpha=0.9, color = cor))
plt.annotate(rotulo +"\n"+ format(emi, ","), (x,y), size=15, va="center", ha="center")
#
plt.xticks([])
plt.yticks([])
#
plt.show()