---
name: plot_heatmap_log
kind: function
lang: py
domain: datascience
version: "1.0.0"
purity: impure
signature: "def plot_heatmap_log(ax: Axes, xs: list[float] | np.ndarray, ys: list[float] | np.ndarray, extent: tuple[float, float, float, float], bins: int = 200, cmap: str = 'hot', alpha: float = 0.6) -> None"
description: "Dibuja un heatmap 2D con escala log1p sobre un Axes de matplotlib. Usa np.histogram2d con el extent dado y ax.imshow para renderizar."
tags: [visualization, heatmap, histogram, matplotlib, datascience, log, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["numpy", "matplotlib"]
params:
  - name: ax
    desc: "matplotlib Axes sobre el que se dibuja el heatmap."
  - name: xs
    desc: "Coordenadas X de los puntos."
  - name: ys
    desc: "Coordenadas Y de los puntos."
  - name: extent
    desc: "Bounding box como (minx, maxx, miny, maxy) que define el rango del histograma."
  - name: bins
    desc: "Número de bins del histograma en cada eje. Default 200."
  - name: cmap
    desc: "Nombre del colormap de matplotlib. Default 'hot'."
  - name: alpha
    desc: "Opacidad del overlay (0-1). Default 0.6."
output: "None. Modifica el Axes in-place añadiendo el heatmap como imagen con ax.imshow."
tested: true
tests:
  - "100 puntos no lanza excepción"
  - "ax tiene al menos una imagen tras la llamada"
test_file_path: "python/functions/datascience/tests/test_plot_heatmap_log.py"
file_path: "python/functions/datascience/plot_heatmap_log.py"
source_repo: "internal:footprint_aurgi"
source_license: "internal-aurgi"
source_file: "zonas_mapas_aurgi/examples/generar_reporte_madrid.py:62"
---

## Ejemplo

```python
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from datascience.plot_heatmap_log import plot_heatmap_log

rng = np.random.default_rng(42)
xs = rng.uniform(-4.0, -3.5, 500)
ys = rng.uniform(40.3, 40.6, 500)

fig, ax = plt.subplots()
plot_heatmap_log(ax, xs, ys, extent=(-4.0, -3.5, 40.3, 40.6), bins=100)
fig.savefig("heatmap.png")
```

## Notas

Aplica `np.log1p` a las cuentas del histograma para comprimir el rango dinámico y hacer visibles tanto zonas densas como dispersas. El histograma se transpone (`counts.T`) antes de pasar a imshow para alinear correctamente los ejes x/y. `aspect="auto"` permite que la imagen se estire al aspecto del Axes.
