Tutorial Power BI: Visuales personalizadas con el formato SVG

Hoy os presentamos un tutorial que os permitirá crear visualizaciones personalizadas y dinámicas a medida para vuestros informes gracias al formato vectorial SVG.
Por ejemplo, si estáis diseñando un informe demográfico, podremos crear gráficos con los iconos de hombre y mujer y rellenarlos según el porcentaje de población de cada género.

También podríamos crear porcentajes de humedad en gráficos con forma de gota, iconos de 5 estrellas que se van rellenando según la votación de una película o formas que cambian de color y tamaño según los datos de nuestro modelo.

¿Qué es el formato SVG?
Básicamente, el formato SVG es un formato de imagen vectorial escalable cuya ventaja es que tiene un código XML relativamente limpio por debajo. En la siguiente imagen podéis ver una sencilla imagen SVG (cuadrado rojo) y su correspondiente código:

Lo bueno de este formato es que modificando el código, modificamos la imagen vectorial. Por código podemos cambiar su altura, anchura o por ejemplo el color.
Otra de sus ventajas es que es un código bastante limpio y ordenado por capas, lo que nos permite poder encontrar la parte de código que queremos modificar para cambiar la imagen.
¿Cómo podemos usar SVG en Power BI?
La idea de este tutorial es usar el custom visual HTML Content, que nos permite insertar código HTML e imágenes en nuestros informes, pero haciendo que parte del código del SVG dependa de algún campo o medida de nuestro modelo y así convertirlo en un gráfico dinámico.
Para descargaros el custom visual de HTML Content deberías pulsar en el icono “…” al final de las visuales en Power BI Desktop y pulsar la opción “Obtener más objetos visuales“:

Se os abrirá una ventana de la Appsource de Microsoft y allí podréis buscar por HTML Content:

Una vez hayamos descargado el visual de HTML Content veremos que solo podemos arrastrar un campo que debe ser tipo texto. En esta medida es donde introduciremos el código dinámico, pero eso ya lo veremos más adelante.
Nuestro Ejemplo: Reservas de agua en embalses
Origen de los Datos
Para ilustrar este tutorial he seleccionado un conjunto de datos público con el historial del nivel de agua de las cuencas de toda la geografía española. Podéis descargar este dataset dese el siguiente link de El Boletín Hidrológico semanal del Ministerio.
Debéis descargar el histórico de embalses desde 1988:

El fichero es una tabla Access con sólo 6 columnas, pero muchos registros históricos (casi 650 mil):

Creando nuestro primer SVG
Lo primero que necesitamos es un programa gráfico para crear un fichero SVG. Yo utilizo Adobe Illustrator porque, como me gusta bastante el diseño, tengo una licencia de este producto. Si queréis un software gratuito podéis usar GIMP o incluso crear una imagen con formas en PowerPoint y exportarlo como SVG.
En este ejemplo vamos a crear un cuadrado azul que aumentará la altura en función del % de agua de nuestros embalses. Sólo deberemos modificar la propiedad de Altura de nuestro código XML en el fichero SVG en base a la medida “% de AGUA“.
Creamos un cuadrado azul con nuestro software gráfico y lo exportamos como SVG. Yo le he puesto un relleno azul con degradado (de azul más claro a más oscuro para simular la profundidad).

En otra capa superior he puesto una linea discontinua verde donde estaría el nivel del 100% de agua para que nos sirva de referencia, pero esto no es necesario si no os queréis complicar.
Si abrimos el fichero SVG creado con un bloc de notas veremos el siguiente código XML:

Vemos que en la capa 2 está nuestro rectángulo (etiqueta <rect>) y que tiene una propiedad height=”768″ que podremos modificar para hacer este gráfico dinámico. En cambio, la línea discontinua que marca el 100% de agua está en la capa3, por lo que no se verá afectada.
Añadiendo el código en una visual HTML Content
Para poder usar esta imagen en un informe de Power BI tendremos que:
- Crear una nueva medida con el nuevo código
- Añadir una visual HTML Content a nuestro informe
- Arrastrar nuestra medida a nuestra nueva visual HTML
Crearemos la medida DAX simplemente pegando el código entre comillas dobles (como si fuese un texto fijo):
Lo único que tenemos que tener en cuenta son 2 puntos:
- Hay que sustituir en el código las comillas dobles por dobles comillas dobles (para que no lo interprete como final del texto)
- Podemos encadenar textos y sustituir parte del texto con nuestras medidas y así hacer el SVG dinámico
La medida DAX quedaría en nuestro caso así:
SVG NIVEL AGUA =
"<svg version=""1.1"" xmlns=""http://www.w3.org/2000/svg"" xmlns:xlink=""http://www.w3.org/1999/xlink"" x=""0px"" y=""0px""
viewBox=""0 0 1366 768"" style=""enable-background:new 0 0 1366 768;"" xml:space=""preserve"">
<style type=""text/css"">
.st0{fill:url(#SVGID_1_);}
.st1{fill:none;stroke:#006837;stroke-width:16;stroke-miterlimit:10;}
.st2{fill:none;stroke:#006837;stroke-width:16;stroke-miterlimit:10;stroke-dasharray:11.9823,11.9823;}
</style>
<g id=""Capa_2"">
<g>
<linearGradient id=""SVGID_1_"" gradientUnits=""userSpaceOnUse"" x1=""685.9111"" y1=""669.2866"" x2=""679.9111"" y2=""81.2866"">
<stop offset=""0"" style=""stop-color:#0071BC""/>
<stop offset=""0.1064"" style=""stop-color:#1684D0""/>
<stop offset=""0.2358"" style=""stop-color:#2895E0""/>
<stop offset=""0.3894"" style=""stop-color:#35A0EC""/>
<stop offset=""0.5886"" style=""stop-color:#3DA7F3""/>
<stop offset=""1"" style=""stop-color:#3FA9F5""/>
</linearGradient>
<rect class=""st0"" x=""0.8"" y="""&[Inicio Agua]&""" class=""st1"" width=""1364.4"" height="""&[Altura Agua]&"""/>
</g>
</g>
<g id=""Capa_3"">
<g>
<g>
<line class=""st1"" x1=""0"" y1=""10"" x2=""6"" y2=""10""/>
<line class=""st2"" x1=""18"" y1=""10"" x2=""1354"" y2=""10""/>
<line class=""st1"" x1=""1360"" y1=""10"" x2=""1366"" y2=""10""/>
</g>
</g>
</g>
</svg>"Veis que he marcado en rojo las partes en las que he sustituido un número fijo (valor del “eje Y” y de la “altura”) por la medida correspondiente.
En principio sólo quería cambiar la altura, pero me di cuenta que empieza a dibujar desde la parte superior y el agua se me quedaba en el nivel del 100% y no llegaba hasta el fondo. Por eso necesité una segunda medida para indicar a partir de que punto del “eje Y” (vertical) debía empezar a dibujar el cuadrado. Las medidas son:
- INICIO AGUA: que indica a que altura debe empezar el agua.
- ALTURA AGUA: que multiplica la altura original del cuadrado por el % de agua.
Aquí podéis ver el resultado en nuestro informe de Power BI:

El Número en % con el nombre de la medida es una tarjeta con fondo transparente que hemos puesto encima en nuestro HTML Content, aunque también podíamos haberlo añadido en una capa de nuestro SVG.
El informe final
Os dejo el informe final para que podáis interactuar con él y ver como un SVG dinámico puede mejorar la calidad y aspecto final de nuestro reporte:
En cuanto a los otros SVGs de % de agua por ámbito hidrológico se han realizado igual que el anterior, pero la imagen vectorial incluía el borde verde y hemos creado una medida para cambiar el color de relleno en base al valor del “% de Agua”
Recordad que si estáis suscritos a nuestra newsletter mensual (es gratis) podréis descargaros los ficheros .pbix originales de nuestros tutoriales.
Conclusiones
Los formatos SVG junto con el custom visual de HTML Content nos proporcionan una versatilidad increíble para crear y adaptar nuestras visualizaciones a la temática de nuestro informe.
Gracias a ellos podemos hacer dinámico cualquier imagen vectorial y adaptarla según los datos de nuestro modelo.
¿Conocíais ya esta opción de Power BI? ¿Tenéis alguna idea de como implementarla en vuestros informes? ¿Dudas? Compartirlas en los comentarios de este tutorial y ¡prometemos respuestas!







Me interesa este tipo de visualización
Hola Maritza,
Como ves en el tutorial, solo debes descargarte la visual personalizada de “HTML Content” y podrás crear visuales con tus propias imágenes vectoriales SVG sin problemas.
Espero que las uses en tus informes de Power BI!
Un saludo,
Un saludo Ivan,
Interesante, gracias por tan gran conocimiento.
Gracias Paulo po tus palabras y por leer nuestro blog!! :D