Gráfico circular de Matplotlib: guía completa para crear gráficos de pastel en Python
Updated on
Crear visualizaciones de datos efectivas es fundamental para comunicar insights con claridad. Cuando necesitas mostrar proporciones o porcentajes de un todo, los gráficos de pastel se convierten en una herramienta esencial en tu arsenal de visualización. Sin embargo, muchos analistas de datos tienen dificultades para crear gráficos de pastel con aspecto profesional que destaquen adecuadamente los segmentos importantes, usen colores apropiados y muestren porcentajes con precisión. El gráfico de pastel predeterminado de matplotlib suele verse simple, carece de contexto y no logra enfatizar los puntos clave de los datos.
Estos retos de visualización se vuelven más agudos al presentar a stakeholders que necesitan comprender rápidamente distribuciones de cuota de mercado, asignaciones de presupuesto o desgloses de respuestas de encuestas. Un gráfico de pastel mal diseñado puede confundir en lugar de aclarar, lo que conduce a interpretaciones erróneas de métricas críticas del negocio.
Matplotlib proporciona una función completa plt.pie() con amplias opciones de personalización que transforman gráficos circulares básicos en visualizaciones profesionales. Esta guía muestra cómo crear gráficos de pastel desde proporciones simples hasta diagramas anidados complejos, con ejemplos prácticos que cubren etiquetas, colores, porciones separadas (exploded slices), gráficos de dona e integración con pandas DataFrames para flujos de trabajo reales de análisis de datos.
Sintaxis básica de gráficos de pastel en Matplotlib
La base para crear gráficos de pastel en matplotlib comienza con plt.pie(), que solo requiere una lista o un array de valores que representen el tamaño de cada porción.
import matplotlib.pyplot as plt
# Basic pie chart data
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
# Create pie chart
plt.pie(sizes, labels=labels)
plt.title('Market Share Distribution')
plt.show()Esto crea un gráfico circular básico donde el tamaño de cada porción es proporcional a los valores en la lista sizes. Matplotlib calcula automáticamente los porcentajes y los ángulos para cada segmento. El gráfico asigna colores a partir del ciclo de colores predeterminado, que no siempre se adapta a tus necesidades de presentación.
Para que se vea correctamente circular en lugar de elíptico, añade plt.axis('equal'):
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
plt.pie(sizes, labels=labels)
plt.axis('equal') # Equal aspect ratio ensures circular shape
plt.title('Market Share Distribution')
plt.show()Mostrar porcentajes con autopct
El parámetro autopct formatea y muestra automáticamente los valores porcentuales en cada porción, haciendo el gráfico más informativo sin cálculos manuales.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.axis('equal')
plt.title('Market Share with Percentages')
plt.show()La cadena de formato '%1.1f%%' muestra porcentajes con un decimal. El primer % inicia el especificador de formato, 1.1f indica un dígito antes del decimal y uno después, y %% produce un símbolo de porcentaje literal en la salida.
Para porcentajes enteros sin decimales, usa '%1.0f%%':
plt.pie(sizes, labels=labels, autopct='%1.0f%%')También puedes pasar una función personalizada a autopct para tener más control sobre cómo se muestran los porcentajes:
import matplotlib.pyplot as plt
sizes = [350, 250, 200, 200]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
def make_autopct(values):
def my_autopct(pct):
total = sum(values)
val = int(round(pct * total / 100.0))
return f'{pct:.1f}%\n({val:d})'
return my_autopct
plt.pie(sizes, labels=labels, autopct=make_autopct(sizes))
plt.axis('equal')
plt.title('Market Share with Counts and Percentages')
plt.show()Esto muestra tanto el porcentaje como el conteo real en cada porción.
Colores personalizados y colormaps
El parámetro colors acepta una lista de especificaciones de color para reemplazar el ciclo de colores predeterminado de matplotlib. Puedes usar colores con nombre, códigos hex o tuplas RGB.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
plt.axis('equal')
plt.title('Market Share with Custom Colors')
plt.show()Para una selección de color basada en datos, usa colormaps de matplotlib:
import matplotlib.pyplot as plt
import numpy as np
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
# Generate colors from a colormap
cmap = plt.cm.Set3
colors = cmap(np.linspace(0, 1, len(sizes)))
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
plt.axis('equal')
plt.title('Market Share with Colormap')
plt.show()Colormaps populares para gráficos de pastel incluyen Set1, Set2, Set3, Pastel1, Pastel2 y tab10.
Separar porciones (explode) para dar énfasis
El parámetro explode separa porciones específicas del centro para enfatizar puntos de datos importantes. Cada valor en la tupla explode representa el desplazamiento radial de la porción correspondiente.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
explode = (0.1, 0, 0, 0) # Explode the first slice
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
explode=explode)
plt.axis('equal')
plt.title('Market Share with Exploded Slice')
plt.show()El valor 0.1 mueve la primera porción hacia afuera un 10% del radio. Puedes separar varias porciones:
explode = (0.1, 0.05, 0, 0) # Explode first two slices
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
explode=explode)Añadir sombra y ángulo de inicio
El parámetro shadow agrega una sombra para un efecto tridimensional, mientras que startangle rota todo el gráfico para posicionar las porciones en ángulos específicos.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
explode = (0.1, 0, 0, 0)
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
explode=explode, shadow=True, startangle=90)
plt.axis('equal')
plt.title('Market Share with Shadow and Rotation')
plt.show()El startangle=90 rota el gráfico para que la primera porción comience a 90 grados (parte superior del círculo) en lugar del valor predeterminado 0 grados (lado derecho). Esto es útil para colocar porciones importantes en la parte superior y mejorar la visibilidad.
Crear gráficos de dona
Los gráficos de dona son gráficos de pastel con un centro hueco, creados usando el parámetro wedgeprops para configurar el ancho de cada porción.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
# Create donut chart
wedgeprops = {'width': 0.4}
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
wedgeprops=wedgeprops)
plt.axis('equal')
plt.title('Market Share Donut Chart')
plt.show()El valor width de 0.4 crea un anillo que equivale al 40% del radio total. Un valor menor crea un anillo más fino, mientras que valores cercanos a 1.0 se aproximan a un gráfico de pastel completo.
Puedes añadir texto en el centro del gráfico de dona:
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
wedgeprops = {'width': 0.4, 'edgecolor': 'white', 'linewidth': 2}
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
wedgeprops=wedgeprops)
plt.axis('equal')
# Add center text
plt.text(0, 0, 'Total\nSales', ha='center', va='center',
fontsize=14, fontweight='bold')
plt.title('Market Share Donut Chart')
plt.show()Gráficos de pastel anidados y concéntricos
Crea visualizaciones complejas trazando varios gráficos de pastel con radios diferentes para mostrar relaciones jerárquicas en los datos.
import matplotlib.pyplot as plt
import numpy as np
# Outer ring data
outer_sizes = [35, 25, 20, 20]
outer_labels = ['Product A', 'Product B', 'Product C', 'Product D']
outer_colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
# Inner ring data (subcategories)
inner_sizes = [15, 20, 12, 13, 10, 10, 8, 12]
inner_labels = ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'D1', 'D2']
inner_colors = ['#ffcccc', '#ff6666', '#99ccff', '#3399ff',
'#ccffcc', '#66ff66', '#ffe6cc', '#ffb366']
fig, ax = plt.subplots()
# Outer pie
ax.pie(outer_sizes, labels=outer_labels, colors=outer_colors,
autopct='%1.1f%%', radius=1.2, wedgeprops={'width': 0.4})
# Inner pie
ax.pie(inner_sizes, labels=inner_labels, colors=inner_colors,
autopct='%1.0f%%', radius=0.8, wedgeprops={'width': 0.4})
ax.axis('equal')
plt.title('Nested Pie Chart: Products and Subcategories')
plt.show()Esto crea dos gráficos de dona concéntricos donde el anillo interior muestra subcategorías de los segmentos del anillo exterior.
Añadir leyendas
Para gráficos con muchas porciones o cuando las etiquetas saturan la visualización, mueve las etiquetas a una leyenda usando la función legend().
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 15, 5]
labels = ['Product A', 'Product B', 'Product C', 'Product D', 'Others']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
plt.pie(sizes, colors=colors, autopct='%1.1f%%', startangle=90)
plt.axis('equal')
plt.legend(labels, loc='upper left', bbox_to_anchor=(1, 0, 0.5, 1))
plt.title('Market Share Distribution')
plt.tight_layout()
plt.show()El parámetro bbox_to_anchor posiciona la leyenda fuera del área del gráfico. La función tight_layout() ajusta el área de la figura para evitar que la leyenda se recorte.
Para entradas de leyenda personalizadas con porcentajes:
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 15, 5]
labels = ['Product A', 'Product B', 'Product C', 'Product D', 'Others']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
wedges, texts, autotexts = plt.pie(sizes, colors=colors, autopct='%1.1f%%',
startangle=90)
plt.axis('equal')
# Create legend with labels and percentages
legend_labels = [f'{label} ({size}%)' for label, size in zip(labels, sizes)]
plt.legend(wedges, legend_labels, loc='upper left',
bbox_to_anchor=(1, 0, 0.5, 1))
plt.title('Market Share Distribution')
plt.tight_layout()
plt.show()Referencia de parámetros del gráfico de pastel
| Parameter | Type | Description | Example |
|---|---|---|---|
x | array-like | Tamaños de las porciones (obligatorio) | [30, 25, 20, 25] |
labels | list of str | Etiquetas de texto para cada porción | ['A', 'B', 'C', 'D'] |
colors | list | Colores para cada porción | ['red', 'blue', 'green'] |
autopct | str or function | Cadena de formato o función para porcentajes | '%1.1f%%' |
explode | tuple | Desplazamiento radial para cada porción | (0.1, 0, 0, 0) |
shadow | bool | Agregar sombra | True or False |
startangle | float | Ángulo de rotación en grados | 90 |
radius | float | Radio del gráfico de pastel | 1.0 (default) |
wedgeprops | dict | Propiedades para los wedges | {'width': 0.4} |
textprops | dict | Propiedades de las etiquetas de texto | {'fontsize': 12} |
labeldistance | float | Distancia de las etiquetas al centro | 1.1 (default) |
pctdistance | float | Distancia del texto de porcentaje al centro | 0.6 (default) |
counterclock | bool | Dirección de las porciones | True (default) |
frame | bool | Dibujar el marco del eje | False (default) |
Personalizar propiedades de texto
El parámetro textprops controla la apariencia de todos los elementos de texto en el gráfico de pastel, incluyendo etiquetas y porcentajes.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
textprops = {'fontsize': 14, 'fontweight': 'bold', 'color': 'darkblue'}
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
textprops=textprops)
plt.axis('equal')
plt.title('Market Share with Custom Text', fontsize=16, fontweight='bold')
plt.show()Para controlar por separado las etiquetas y el texto de porcentaje, accede a los objetos de texto devueltos:
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
wedges, texts, autotexts = plt.pie(sizes, labels=labels, colors=colors,
autopct='%1.1f%%')
# Customize label text
for text in texts:
text.set_fontsize(12)
text.set_fontweight('bold')
# Customize percentage text
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontsize(10)
autotext.set_fontweight('bold')
plt.axis('equal')
plt.title('Market Share with Styled Text')
plt.show()Trabajar con Pandas DataFrames
En el análisis de datos del mundo real se suelen usar pandas DataFrames. Puedes crear gráficos de pastel directamente a partir de columnas del DataFrame.
import matplotlib.pyplot as plt
import pandas as pd
# Sample DataFrame
data = {
'Product': ['Product A', 'Product B', 'Product C', 'Product D'],
'Sales': [350000, 250000, 200000, 200000]
}
df = pd.DataFrame(data)
# Create pie chart from DataFrame
plt.pie(df['Sales'], labels=df['Product'], autopct='%1.1f%%',
startangle=90)
plt.axis('equal')
plt.title('Sales Distribution by Product')
plt.show()Para datos agrupados, usa agregación de pandas antes de graficar:
import matplotlib.pyplot as plt
import pandas as pd
# Sample DataFrame with categories
data = {
'Region': ['North', 'South', 'East', 'West', 'North', 'South', 'East', 'West'],
'Product': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'Sales': [120000, 80000, 95000, 105000, 90000, 110000, 85000, 95000]
}
df = pd.DataFrame(data)
# Group by region and sum sales
region_sales = df.groupby('Region')['Sales'].sum()
plt.pie(region_sales.values, labels=region_sales.index, autopct='%1.1f%%',
startangle=90)
plt.axis('equal')
plt.title('Total Sales by Region')
plt.show()Guardar gráficos de pastel en archivos
Guarda gráficos de pastel en varios formatos de imagen usando plt.savefig() antes de llamar a plt.show().
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
plt.axis('equal')
plt.title('Market Share Distribution')
# Save as PNG with high DPI
plt.savefig('market_share.png', dpi=300, bbox_inches='tight')
# Save as PDF for vector graphics
plt.savefig('market_share.pdf', bbox_inches='tight')
# Save as SVG for web use
plt.savefig('market_share.svg', bbox_inches='tight')
plt.show()El parámetro bbox_inches='tight' elimina el espacio en blanco extra alrededor del gráfico. El parámetro dpi controla la resolución para formatos raster como PNG.
Ejemplo del mundo real: desglose de presupuesto
import matplotlib.pyplot as plt
import pandas as pd
# Annual budget data
budget_data = {
'Category': ['Salaries', 'Marketing', 'Operations', 'R&D', 'Infrastructure'],
'Amount': [450000, 180000, 120000, 150000, 100000]
}
df = pd.DataFrame(budget_data)
# Calculate total budget
total_budget = df['Amount'].sum()
# Define colors
colors = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9ca24', '#6c5ce7']
# Create pie chart
fig, ax = plt.subplots(figsize=(10, 7))
wedges, texts, autotexts = ax.pie(df['Amount'], labels=df['Category'],
colors=colors, autopct='%1.1f%%',
startangle=90, explode=(0.05, 0, 0, 0, 0))
# Customize text
for text in texts:
text.set_fontsize(12)
text.set_fontweight('bold')
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontsize(10)
autotext.set_fontweight('bold')
ax.axis('equal')
plt.title(f'Annual Budget Breakdown\nTotal: ${total_budget:,}',
fontsize=16, fontweight='bold', pad=20)
plt.tight_layout()
plt.savefig('budget_breakdown.png', dpi=300, bbox_inches='tight')
plt.show()Ejemplo del mundo real: resultados de encuesta
import matplotlib.pyplot as plt
import numpy as np
# Survey response data
responses = {
'Very Satisfied': 145,
'Satisfied': 230,
'Neutral': 85,
'Dissatisfied': 30,
'Very Dissatisfied': 10
}
labels = list(responses.keys())
sizes = list(responses.values())
total_responses = sum(sizes)
# Color scheme from red to green
colors = ['#2ecc71', '#3498db', '#95a5a6', '#e67e22', '#e74c3c']
fig, ax = plt.subplots(figsize=(10, 7))
wedges, texts, autotexts = ax.pie(sizes, labels=labels, colors=colors,
autopct=lambda pct: f'{pct:.1f}%\n({int(pct * total_responses / 100)})',
startangle=90, wedgeprops={'edgecolor': 'white', 'linewidth': 2})
for text in texts:
text.set_fontsize(11)
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontsize(9)
autotext.set_fontweight('bold')
ax.axis('equal')
plt.title(f'Customer Satisfaction Survey Results\nTotal Responses: {total_responses}',
fontsize=16, fontweight='bold', pad=20)
plt.tight_layout()
plt.show()Ejemplo del mundo real: análisis de cuota de mercado
import matplotlib.pyplot as plt
import pandas as pd
# Market share data for multiple quarters
data = {
'Company': ['Company A', 'Company B', 'Company C', 'Company D', 'Others'],
'Q1_Share': [28, 24, 18, 15, 15],
'Q2_Share': [30, 22, 19, 14, 15],
'Q3_Share': [32, 21, 18, 15, 14],
'Q4_Share': [35, 20, 17, 16, 12]
}
df = pd.DataFrame(data)
# Create subplots for each quarter
fig, axes = plt.subplots(2, 2, figsize=(14, 12))
quarters = ['Q1_Share', 'Q2_Share', 'Q3_Share', 'Q4_Share']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
for idx, (ax, quarter) in enumerate(zip(axes.flat, quarters)):
wedges, texts, autotexts = ax.pie(df[quarter], labels=df['Company'],
colors=colors, autopct='%1.1f%%',
startangle=90)
for text in texts:
text.set_fontsize(10)
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontsize(9)
autotext.set_fontweight('bold')
ax.set_title(f'Market Share {quarter.replace("_Share", "")}',
fontsize=12, fontweight='bold')
plt.suptitle('Quarterly Market Share Analysis', fontsize=16, fontweight='bold', y=0.995)
plt.tight_layout()
plt.savefig('market_share_analysis.png', dpi=300, bbox_inches='tight')
plt.show()Combinar gráficos de pastel con otras visualizaciones
Crea dashboards completos combinando gráficos de pastel con gráficos de barras, gráficos de líneas o tablas.
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Sample data
categories = ['Product A', 'Product B', 'Product C', 'Product D']
current_sales = [350000, 250000, 200000, 200000]
previous_sales = [320000, 280000, 180000, 220000]
# Create figure with subplots
fig = plt.figure(figsize=(14, 6))
# Pie chart showing current market share
ax1 = plt.subplot(1, 2, 1)
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
ax1.pie(current_sales, labels=categories, colors=colors, autopct='%1.1f%%',
startangle=90)
ax1.set_title('Current Market Share', fontsize=14, fontweight='bold')
# Bar chart showing comparison
ax2 = plt.subplot(1, 2, 2)
x = np.arange(len(categories))
width = 0.35
bars1 = ax2.bar(x - width/2, previous_sales, width, label='Previous Period',
color='#95a5a6', alpha=0.8)
bars2 = ax2.bar(x + width/2, current_sales, width, label='Current Period',
color='#3498db', alpha=0.8)
ax2.set_xlabel('Products', fontsize=12, fontweight='bold')
ax2.set_ylabel('Sales ($)', fontsize=12, fontweight='bold')
ax2.set_title('Sales Comparison', fontsize=14, fontweight='bold')
ax2.set_xticks(x)
ax2.set_xticklabels(categories)
ax2.legend()
ax2.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('combined_visualization.png', dpi=300, bbox_inches='tight')
plt.show()Cuándo usar gráficos de pastel vs gráficos de barras
Los gráficos de pastel funcionan mejor en escenarios específicos, pero los gráficos de barras suelen ofrecer comparaciones más claras.
Usa gráficos de pastel cuando:
- Muestras partes de un todo (los porcentajes deben sumar 100%)
- Presentas 5 categorías o menos
- Quieres enfatizar uno o dos segmentos dominantes
- Las proporciones exactas importan menos que la composición general
- Creas resúmenes ejecutivos de alto nivel
Usa gráficos de barras cuando:
- Comparas valores entre categorías
- Muestras más de 5 categorías
- Necesitas comparaciones precisas de valores
- Los valores no suman un todo significativo
- Muestras tendencias a lo largo del tiempo
- Los stakeholders necesitan comparar segmentos de tamaño similar
Ejemplo de comparación:
import matplotlib.pyplot as plt
data = {'Category A': 23, 'Category B': 19, 'Category C': 18,
'Category D': 17, 'Category E': 13, 'Category F': 10}
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
# Pie chart
ax1.pie(data.values(), labels=data.keys(), autopct='%1.1f%%', startangle=90)
ax1.set_title('Pie Chart: Harder to Compare Similar Values', fontweight='bold')
# Bar chart
ax2.bar(data.keys(), data.values(), color='#3498db')
ax2.set_ylabel('Value', fontweight='bold')
ax2.set_title('Bar Chart: Easier to Compare Similar Values', fontweight='bold')
ax2.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()El gráfico de barras hace que las pequeñas diferencias entre categorías sean mucho más evidentes que en el gráfico de pastel.
Gráficos de pastel interactivos con PyGWalker
Para análisis exploratorio de datos que requiere visualizaciones interactivas, PyGWalker (opens in a new tab) transforma pandas DataFrames en interfaces interactivas tipo Tableau con creación de gráficos de pastel mediante drag-and-drop.
import pandas as pd
import pygwalker as pyg
# Sample DataFrame
data = {
'Product': ['Product A', 'Product B', 'Product C', 'Product D', 'Product E'],
'Sales': [350000, 250000, 200000, 200000, 150000],
'Region': ['North', 'South', 'East', 'West', 'North']
}
df = pd.DataFrame(data)
# Launch interactive visualization interface
walker = pyg.walk(df)PyGWalker permite que analistas de negocio sin experiencia en programación creen gráficos de pastel y otras visualizaciones de forma interactiva, filtren datos dinámicamente y exporten resultados para presentaciones. La herramienta maneja agregaciones complejas y ofrece resúmenes estadísticos integrados, lo que la hace valiosa para prototipado rápido antes de finalizar visualizaciones de producción con matplotlib.
Personalización avanzada: colores de borde y estilos de línea
Añade separación visual entre porciones usando colores de borde y grosores de línea mediante el parámetro wedgeprops.
import matplotlib.pyplot as plt
sizes = [35, 25, 20, 20]
labels = ['Product A', 'Product B', 'Product C', 'Product D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
wedgeprops = {
'edgecolor': 'black',
'linewidth': 2,
'linestyle': '-',
'antialiased': True
}
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
startangle=90, wedgeprops=wedgeprops)
plt.axis('equal')
plt.title('Market Share with Edge Styling')
plt.show()Para un efecto sutil, usa bordes blancos:
wedgeprops = {'edgecolor': 'white', 'linewidth': 3}Manejar porciones pequeñas y superposición de etiquetas
Cuando trabajas con muchas porciones pequeñas, las etiquetas pueden superponerse. Las soluciones incluyen usar una leyenda, aumentar el tamaño de la figura o ajustar la posición de las etiquetas.
import matplotlib.pyplot as plt
# Data with several small slices
sizes = [30, 25, 15, 10, 8, 5, 4, 3]
labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
colors = plt.cm.Set3(range(len(sizes)))
fig, ax = plt.subplots(figsize=(10, 8))
wedges, texts, autotexts = ax.pie(sizes, colors=colors, autopct='%1.1f%%',
startangle=90, pctdistance=0.85)
# Remove labels from pie and use legend
for text in texts:
text.set_text('')
ax.legend(wedges, labels, title="Categories", loc="center left",
bbox_to_anchor=(1, 0, 0.5, 1))
ax.axis('equal')
ax.set_title('Distribution with Many Categories', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()Como alternativa, muestra solo los porcentajes en el gráfico y usa una leyenda para los nombres de las categorías, reduciendo el desorden visual.
Crear gráficos de dona proporcionales con múltiples anillos
Construye visualizaciones jerárquicas complejas que muestran desgloses por categoría en múltiples niveles.
import matplotlib.pyplot as plt
import numpy as np
# Department budget data
departments = ['Engineering', 'Sales', 'Marketing', 'Operations']
dept_budgets = [400000, 300000, 200000, 100000]
# Team breakdown within departments
teams = ['Backend', 'Frontend', 'Mobile',
'Field Sales', 'Inside Sales',
'Digital', 'Content',
'Logistics', 'Support']
team_budgets = [200000, 150000, 50000,
180000, 120000,
120000, 80000,
60000, 40000]
fig, ax = plt.subplots(figsize=(12, 8))
# Outer ring (departments)
dept_colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12']
outer_pie = ax.pie(dept_budgets, labels=departments, colors=dept_colors,
autopct='%1.1f%%', radius=1.3, wedgeprops={'width': 0.35})
# Inner ring (teams)
team_colors = ['#c0392b', '#e74c3c', '#ec7063',
'#2980b9', '#3498db',
'#27ae60', '#2ecc71',
'#d68910', '#f39c12']
inner_pie = ax.pie(team_budgets, labels=teams, colors=team_colors,
autopct='%1.0f%%', radius=0.95,
wedgeprops={'width': 0.35}, labeldistance=0.7,
textprops={'fontsize': 9})
ax.axis('equal')
plt.title('Organizational Budget Breakdown\nDepartments and Teams',
fontsize=16, fontweight='bold', pad=20)
plt.tight_layout()
plt.show()Esto crea un gráfico de dona de dos niveles donde el anillo interior muestra presupuestos de equipos que corresponden a los segmentos de departamentos del anillo exterior.
Preguntas frecuentes (FAQ)
¿Cómo creo un gráfico de pastel básico en matplotlib?
Usa plt.pie() con una lista de valores y, opcionalmente, etiquetas. Incluye plt.axis('equal') para asegurar una forma circular en lugar de una elipse. La sintaxis básica es plt.pie(sizes, labels=labels) seguida de plt.show() para mostrar el gráfico.
¿Qué hace el parámetro autopct en los gráficos de pastel de matplotlib?
El parámetro autopct muestra automáticamente valores porcentuales en cada porción. Usa cadenas de formato como '%1.1f%%' para porcentajes con un decimal, o '%1.0f%%' para números enteros. También puedes pasar una función personalizada para mostrar simultáneamente porcentajes y valores reales.
¿Cómo creo un gráfico de dona en matplotlib?
Crea un gráfico de dona configurando el parámetro wedgeprops con un valor width menor que 1. Por ejemplo, wedgeprops={'width': 0.4} crea una dona con un anillo equivalente al 40% del radio. Combínalo con plt.text() para añadir etiquetas en el centro hueco.
¿Cómo separo porciones específicas (explode) en un gráfico de pastel?
Usa el parámetro explode con una tupla de valores de desplazamiento para cada porción. Por ejemplo, explode=(0.1, 0, 0, 0) mueve la primera porción hacia afuera un 10% del radio mientras mantiene las demás en su lugar. Valores más altos crean separaciones mayores.
¿Cuándo debería usar gráficos de pastel en lugar de gráficos de barras?
Usa gráficos de pastel al mostrar partes de un todo con 5 categorías o menos donde los porcentajes deben sumar 100%. Usa gráficos de barras al comparar valores entre categorías, mostrar más de 5 elementos o cuando las comparaciones precisas importan más que las proporciones. Los gráficos de barras facilitan comparar segmentos de tamaño similar.
¿Cómo personalizo colores en los gráficos de pastel de matplotlib?
Pasa una lista de colores al parámetro colors usando colores con nombre, códigos hex o tuplas RGB. Para colores basados en datos, usa colormaps de matplotlib como plt.cm.Set3 combinados con np.linspace() para generar arrays de colores. Colormaps populares para pastel incluyen Set1, Set2, Set3 y Pastel1.
¿Cómo agrego una leyenda a un gráfico de pastel en lugar de etiquetas en las porciones?
Llama a plt.legend() con la lista de etiquetas y posiciónala con los parámetros loc y bbox_to_anchor. Por ejemplo, plt.legend(labels, loc='upper left', bbox_to_anchor=(1, 0, 0.5, 1)) coloca la leyenda fuera del gráfico en el lado derecho. Usa plt.tight_layout() para evitar recortes.
Conclusión
Los gráficos de pastel de Matplotlib ofrecen una forma potente de visualizar datos proporcionales cuando se usan adecuadamente. Esta guía cubrió todo el espectro, desde gráficos circulares básicos hasta visualizaciones avanzadas de donas anidadas, con ejemplos prácticos que demuestran etiquetas, colores, porciones separadas, visualización de porcentajes e integración con DataFrames. La tabla de referencia de parámetros sirve como consulta rápida para opciones de personalización, mientras que los ejemplos del mundo real muestran cómo aplicar estas técnicas al análisis de presupuestos, resultados de encuestas y reportes de cuota de mercado.
Recuerda que los gráficos de pastel funcionan mejor con pocas categorías que muestren proporciones claras, mientras que los gráficos de barras son más adecuados para comparaciones detalladas. Para exploración interactiva durante el análisis, PyGWalker ofrece una alternativa sin código para prototipado rápido antes de finalizar visualizaciones de producción. Al combinar estas técnicas de matplotlib con decisiones de diseño cuidadosas sobre cuándo usar pastel frente a barras, puedes crear visualizaciones claras e informativas que comuniquen insights de forma efectiva a cualquier audiencia.