--- 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] 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.