Mapa de árbol

Python
code
Visualization
Author

Marco Aguirre

Published

September 22, 2025

Un Treemap (mapa de árbol) es una visualización compuesta de rectángulos anidados.
Cada rectángulo representa una categoría dentro de una dimensión seleccionada y está ordenado jerárquicamente en un árbol.
El área del rectángulo es proporcional al valor que representa.

Esta técnica fue desarrollada por Ben Shneiderman (Universidad de Maryland) con el objetivo de aprovechar al máximo espacios reducidos en gráficos jerárquicos.
Fuente:dataviz

¿Para qué sirve?

Un Treemap es especialmente útil para mostrar relaciones parte-todo:

  • Permite ver rápidamente qué categorías tienen mayor peso relativo.
  • Facilita la comparación de patrones y cantidades en un espacio limitado.
  • Puede mostrar hasta 3 niveles de jerarquía de manera efectiva en estático.
  • Uso eficiente del espacio → ideal para grandes volúmenes de datos.
  • Permite mostrar simultáneamente jerarquía y proporciones.
  • Con interactividad se pueden explorar fácilmente múltiples niveles.

Errores comunes

Un buen Treemap debe tener:
- Valores numéricos claros.
- Jerarquía bien definida.
- No más de 3–4 rectángulos etiquetados.
- Nivel jerárquico superior bien identificado.
- Solo valores positivos.

Un mal Treemap ocurre cuando:
- Tiene demasiadas categorías → se ve abarrotado.
- Los rectángulos son muy similares en tamaño → difícil de comparar.
- Usa la misma paleta de color para distintas categorías.

Alternativa recomendada:
Cuando el Treemap se vuelve confuso, es mejor usar un gráfico de barras, ya que permite comparar fácilmente de mayor a menor.

Variaciones

  • Estáticos → adecuados para 1–2 niveles jerárquicos.
  • Interactivos → recomendados cuando hay 3 o más niveles.
    • Permiten hacer zoom en un grupo y explorar subcategorías.
    • Clic en el título para volver al nivel superior.

Dataset: Precios Agroindustria de Cacao (2012 - 2025)

Archivo: MAG_PreciosAgroindustriaCacao_2025Junio.csv
Fuente: Ministerio de Agricultura y Ganadería (MAG), Ecuador
Última actualización: Junio 2025

import pandas as pd
df = pd.read_csv("mag_preciosagroindustriacacao_2025junio.csv", sep=";")
print(df.head())
print(df.info())
   PACC_ANIO PACC_MES DPA_PROVINCIA DPA_CANTON        PACC_PRODUCTO  \
0       2012    Enero        El Oro  Arenillas  Cacao seco mezclado   
1       2012    Enero        El Oro  Arenillas  Cacao seco mezclado   
2       2012    Enero        El Oro   El Guabo  Cacao seco mezclado   
3       2012    Enero        El Oro   El Guabo  Cacao seco mezclado   
4       2012    Enero        El Oro    Machala  Cacao seco mezclado   

          PACC_PRESENTACION PACC_TIPO  PACC_PRECIO_USD  PACC_USD_KG  
0  Quintal de 100,00 libras    Compra            71.41         1.57  
1  Quintal de 100,00 libras     Venta            74.06         1.63  
2  Quintal de 100,00 libras    Compra            73.75         1.63  
3  Quintal de 100,00 libras     Venta            84.00         1.85  
4  Quintal de 100,00 libras    Compra            75.00         1.65  
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26246 entries, 0 to 26245
Data columns (total 9 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   PACC_ANIO          26246 non-null  int64  
 1   PACC_MES           26246 non-null  object 
 2   DPA_PROVINCIA      26246 non-null  object 
 3   DPA_CANTON         26246 non-null  object 
 4   PACC_PRODUCTO      26246 non-null  object 
 5   PACC_PRESENTACION  26246 non-null  object 
 6   PACC_TIPO          26246 non-null  object 
 7   PACC_PRECIO_USD    26246 non-null  float64
 8   PACC_USD_KG        26246 non-null  float64
dtypes: float64(2), int64(1), object(6)
memory usage: 1.8+ MB
None
import plotly.express as px
import plotly.io as pio
pio.renderers.default = "notebook"

# Agrupamos por provincia y cantón, tomando el precio promedio
df_group = df.groupby(
    ["DPA_PROVINCIA", "DPA_CANTON"], as_index=False
)["PACC_PRECIO_USD"].mean()

# Treemap
fig = px.treemap(
    df_group,
    path=[px.Constant("Ecuador"), "DPA_PROVINCIA", "DPA_CANTON"],
    values="PACC_PRECIO_USD",
    color="PACC_PRECIO_USD",
    color_continuous_scale="RdBu",
    color_continuous_midpoint=np.average(df_group["PACC_PRECIO_USD"])
)

fig.update_layout(
    title="Precios de cacao por provincia y cantón",
    margin=dict(t=50, l=25, r=25, b=25)
)

fig.show()

# Treemap
fig = px.treemap(
    df_group,
    path=[px.Constant("Ecuador"), "DPA_PROVINCIA", "DPA_CANTON"],
    values="PACC_PRECIO_USD",
    color="PACC_PRECIO_USD",
    color_continuous_scale="RdBu",
    color_continuous_midpoint=np.average(df_group["PACC_PRECIO_USD"]),
    range_color=[0, df_group["PACC_PRECIO_USD"].max()]  # 🔹 Ajuste de la escala
)

fig.update_layout(
    title="Precios de cacao por provincia y cantón",
    margin=dict(t=50, l=25, r=25, b=25)
)

fig.show()

Cambio de color y titulo , eliminacion barra lateral, redondeo


df_group = (
    df.groupby(["DPA_PROVINCIA", "DPA_CANTON"], as_index=False)["PACC_PRECIO_USD"]
    .mean()
    .round(2)
)
# Treemap 
fig = px.treemap(
    df_group,
    path=[px.Constant("Ecuador"), "DPA_PROVINCIA", "DPA_CANTON"],
    values="PACC_PRECIO_USD",
    color="PACC_PRECIO_USD",
    color_continuous_scale="BuGn",  # 
    color_continuous_midpoint=np.average(df_group["PACC_PRECIO_USD"]),
    range_color=[0, df_group["PACC_PRECIO_USD"].max()]  # inicio en 0
)

# Eliminar barra lateral
fig.update_coloraxes(showscale=False)

fig.update_layout(
    title=' <span style="color:#43B099;">PRECIOS </span>'
          '<span style="color:#9B9B9B;">DE CACAO POR PROVINCIA Y CANTÓN </span>' ,
    margin=dict(t=50, l=25, r=25, b=25)
)

fig.show()

Realize el mismo gráfico para la base de articulos cientificos Ecuador