HOWTO · Seaborn
Cómo crear un gráfico circular de Seaborn
Crea un gráfico circular con plt.pie de Matplotlib y las paletas de colores de Seaborn, y luego añade etiquetas, porcentajes, espaciado y estilo.
En esta página
Crea un gráfico circular en Python dibujándolo con plt.pie de Matplotlib y eligiendo los colores de las porciones con sns.color_palette de Seaborn. Seaborn no incluye una función propia para gráficos circulares; en este flujo de trabajo, cada biblioteca cumple una función distinta, porque Seaborn aporta los colores mientras Matplotlib dibuja el gráfico. Necesitas ambas bibliotecas instaladas (pip install matplotlib seaborn). Los ejemplos siguientes usan valores numéricos para unas pocas categorías, etiquetan cada porción y muestran su proporción del total; un segundo ejemplo convierte el gráfico en un gráfico de anillo con leyenda, y un último ejemplo muestra el error que produce Matplotlib cuando las etiquetas no coinciden con los valores.
Crear un gráfico circular con Seaborn
import matplotlib.pyplot as plt
import seaborn as sns
values = [35, 21, 29, 39, 11]
labels = ["A", "B", "C", "D", "E"]
colors = sns.color_palette("pastel", n_colors=len(values))
explode = [0.08, 0, 0, 0, 0]
plt.pie(
values,
labels=labels,
colors=colors,
autopct="%1.1f%%",
explode=explode,
startangle=90,
counterclock=False,
textprops={"fontsize": 10},
wedgeprops={"linewidth": 1, "edgecolor": "white"},
)
plt.show()
El código produce el gráfico anterior. Los cinco valores suman 135, así que los porcentajes impresos en las porciones son 25,9 % para A, 15,6 % para B, 21,5 % para C, 28,9 % para D y 8,1 % para E. La porción A queda ligeramente separada del resto debido a su desplazamiento explode.
Mantén los valores y las etiquetas alineados por posición: la primera etiqueta corresponde al primer valor, la segunda al segundo y así sucesivamente. Usa una lista de cantidades numéricas que representen partes de un mismo total, como los recuentos de cada categoría. Los porcentajes se calculan a partir de esas cantidades, por lo que indican la proporción de cada categoría y no porcentajes proporcionados por separado.
La lista que se pasa a values determina el tamaño relativo de cada sector. plt.pie dibuja el gráfico, mientras que sns.color_palette devuelve los colores de los sectores. El nombre de la paleta es una cadena: cambia "pastel" por otra paleta de Seaborn, como "deep", "muted", "colorblind", "bright" o "dark". Al establecer n_colors según la longitud de los datos, se solicita un color por cada valor.
La lista labels proporciona los nombres de las categorías en el mismo orden que los valores. El formato autopct muestra el porcentaje de cada valor respecto a la suma de todos ellos; por ejemplo, "%1.1f%%" presenta el porcentaje con un decimal. Usa otra cadena de formato para cambiar la precisión mostrada. Las etiquetas identifican las categorías y los porcentajes facilitan la comparación de sus proporciones.
Para separar visualmente los sectores, pasa a explode una secuencia con una entrada por cada valor. Cada entrada controla el desplazamiento del sector correspondiente, de modo que el primer 0.08 mueve hacia fuera la categoría A y los ceros restantes dejan sus sectores en su sitio. Ajusta esas entradas para destacar otras categorías o usa solo ceros si no quieres desplazar ningún sector.
Personalizar el gráfico circular
Puedes ajustar la orientación y el aspecto del gráfico con más argumentos de plt.pie. startangle gira la posición inicial y counterclock=False establece la dirección en la que se dibujan las porciones. Usa shadow=True para añadir una sombra, textprops para definir las propiedades del texto de las etiquetas y los porcentajes, y wedgeprops para dar estilo a los bordes de las porciones. Un ajuste útil de wedgeprops es width: reduce cada porción hacia el borde y convierte el gráfico circular en un gráfico de anillo, como muestra el siguiente ejemplo. Otros argumentos son frame=True, que añade el marco de los ejes, center=(x, y), que coloca el centro del gráfico circular, y rotatelabels=True, que gira las etiquetas siguiendo sus porciones; estas opciones booleanas usan los valores de Python True o False, sin comillas.
import matplotlib.pyplot as plt
import seaborn as sns
values = [58, 33, 6, 3]
labels = ["Desktop", "Mobile", "Tablet", "Other"]
colors = sns.color_palette("colorblind", n_colors=len(values))
wedges, texts = plt.pie(
values,
colors=colors,
startangle=90,
counterclock=False,
wedgeprops={"width": 0.45, "linewidth": 1, "edgecolor": "white"},
)
plt.legend(wedges, labels, title="Device", loc="center left", bbox_to_anchor=(1, 0.5))
plt.title("Sessions by Device")
plt.show()
Aquí, wedgeprops={"width": 0.45, ...} conserva solo el 45 % exterior de cada porción, lo que deja el centro vacío. Como esta vez las porciones no llevan etiquetas, plt.pie devuelve los objetos de porción, y al pasarlos a plt.legend junto con la lista de etiquetas se crea la leyenda junto al gráfico. plt.title añade el título. Una leyenda se lee mejor que las etiquetas sobre las porciones cuando los nombres de las categorías son largos o varias porciones son finas; los datos de ejemplo suman 100, así que los tamaños de los segmentos se leen directamente como porcentajes (58 %, 33 %, 6 % y 3 %).
Evitar errores de longitud y de valores
Cada argumento por porción debe coincidir con los datos: labels, explode y una lista de colores necesitan exactamente una entrada por cada valor, y cada valor debe ser no negativo, porque una porción no puede ocupar una parte negativa del total. Si las longitudes no coinciden, plt.pie se detiene con un ValueError en lugar de dibujar el gráfico:
import matplotlib.pyplot as plt
values = [35, 21, 29]
labels = ["A", "B"]
plt.pie(values, labels=labels)
plt.show()
Salida:
ValueError: 'labels' must be of length 'x', not 2
La solución es dar a labels una entrada por cada uno de los tres valores. La misma regla se aplica a explode: una lista explode de dos entradas para tres valores produce ValueError: 'explode' must be of length 'x', not 2. Las entradas negativas en values también fallan, con ValueError: Wedge sizes 'x' must be non negative values. Por último, mantén pequeño el número de categorías: con muchas porciones finas, las etiquetas chocan y las proporciones se vuelven difíciles de comparar, así que agrupa las categorías menores en una porción «Other» o cambia a un gráfico de barras.