Tutorial Power BI: gráficos a medida con Deneb

En los últimos meses hemos explorado opciones para realizar gráficos más personalizados y de mayor nivel que los que nos permite por defecto Power BI. Hoy os traemos una visual personalizada (custom visual) llamada Deneb.
Si disfrutasteis con los tutoriales de Charticulator, o HTML, no os podéis perder esta introducción a Deneb Viz, porque este es el inicio de una serie de tutoriales sobre esta gran visualización.
¿Qué es Deneb?
Deneb es un custom visual de Power BI que nos permite hacer visuales declarativas en formato JSON. Se basa en el lenguaje Vega-Lite y Vega para crear sus propias visualizaciones. Aunque suena muy raro de inicio, es muy sencillo y lo veremos en un ejemplo.
Básicamente al crear una visual con Deneb debemos ir creando las etiquetas y valores con las propiedades de formato de nuestra visual. De este modo, dependiendo de las etiquetas o valores que usemos podemos crear diagramas de barras, de línea, mapas de calor, etc… todo con la misma visual.

Nuestro Ejemplo en Deneb: Análisis de los propósitos de Año Nuevo
Origen de los Datos
Para ilustrar nuestro primer tutorial de Deneb vamos a utilizar un dataset de Kaggle sobre propósitos de Año Nuevo.
Este conjunto de datos recoge más de 5.000 tweets del área de Estados Unidos sobre los propósitos de Año Nuevo a finales de 2014 y 2015. Para implementarlo en Power BI Desktop sólo debemos descargar el fichero csv del link anterior y usar el origen de datos “Texto o CSV” para importar los datos a nuestro informe:

Si estáis suscritos a nuestra newsletter mensual (es gratis) podréis descargar el pbix original de este tutorial y ver que apenas he realizado transformaciones. Básicamente, he traducido los valores del campo Género y del campo Categoría al español a través de la Transformación “Reemplazar valores” en el Editor de Consultas de Power Query.
Aparte, como queremos un filtro en nuestro informe por Estado y el conjunto de datos sólo tiene el Código de Estado, he incluido un origen de datos web a wikipedia para obtener el nombre del estado en cuestión a partir de su código ISO.
Deneb Viz Custom Visual
Para poder usar Deneb Viz, debéis descargar este visual en vuestro Power BI Desktop a través del icono de 3 puntos (…) que veréis bajo las visuales estándares de Power BI:

Se abrirá la página de AppSource para ver que objetos visuales podemos descargar y debéis buscar Deneb:

Pulsando sobre el icono de Deneb y el botón “Agregar” os instalará esta visual en vuestro informe.
Recordad que al descargar un custom visual, lo hacéis en el informe y no en Power BI Desktop. Si queréis volver a usarlo en otro informe deberéis volver a descargarlo.Creando nuestra primera visual con Deneb
De igual manera que con el resto de objetos visuales, si pulsamos sobre la nueva visual de Deneb se insertará en nuestro informe y tendrá este aspecto:

Como veis, incluye 3 links muy interesantes para empezar con Deneb:
- Visual Documentation: incluye toda la documentación oficial y detallada de este custom visual (incluyendo un pbix de ejemplo).
- Vega Documentation: Una referencia a las etiquetas y al lenguaje Vega a usar en este custom visual.
- Vega Lite Documentation: Una referencia a las etiquetas y al lenguaje Vega-Lite a usar en este custom visual.
Os recomiendo empezar por Vega-Lite que es una versión reducida de Vega y más sencilla para comenzar a explorar este tipo de visuales.
Tened siempre abierta la documentación de referencia de Vega Lite mientras desarrolláis visuales con Deneb porque os será muy útil.
Indicando los campos a utilizar de nuestro dataset
De igual manera que hacíamos con Charticulator, lo primero es indicar que campos de nuestro dataset usaremos en nuestra visualización con Deneb. Lo haremos de la misma manera que con el resto de visuales, arrastrando los campos al parámetro “Values” de nuestra visual:

En este caso he arrastrado los campos gender, resolution_category y tweet_id porque queremos mostrar el número de tweets por categoría y género. Un par de apuntes:
- He cambiado el nombre de los campos por Gender, Categoría y Tweets. Es importante poner nombres descriptivos a nuestros campos porque en el código Vega-Lite tenemos que hacer referencia a ellos por nombre.
- Recordad que el campo tweet_id (Tweets) debe tener agregación tipo Recuento ya que queremos contar los tweets, no sumar sus valores de id.
Código para crear nuestra visual
Ya tenemos la visual Deneb importada en nuestro informe y le hemos indicado los campos a usar. Ahora sólo queda dar formato a nuestra visual. Para ello, debemos pulsar en el icono de 3 puntos (…) de nuestra visual y en la opción Editar:

Nos aparecerá una pantalla en la que tenemos opciones de crear la visual con Vega-Lite, Vega o a través de una plantilla:

Usaremos Vega-Lite, al ser la opción más sencilla para aprender. En vez de usar los ejemplos guiados de diagrama de barras, scatterplot o línea que nos ofrece la pantalla, usaremos la opción [empty] y así aprenderemos desde cero y pulsamos el botón de “Create“.
A partir de este momento veremos la pantalla principal de Deneb, dividida en una zona de código a la izquierda y otra de visualización a la derecha:

Las etiquetas principales que debemos usar son:
- “data”: indica el origen de los datos y en nuestro caso será “dataset” ya que así hacemos referencia a los campos que hemos arrastrado a nuestra visual.
- “mark”: indica el tipo de gráfico que queremos configurar. Lo bueno de Deneb es que, a diferencia de la mayoría de visuales de Power BI, podemos crear varios tipos de gráficos en uno. Para crear varias visuales en una usaremos la etiqueta “layer“, esto es, crearemos capas con diferentes “marks”
- “encoding”: esta etiqueta nos sirve para vincular alguno de los parámetros de nuestro diseño con campos del dataset.
En la parte de código vemos que ya se ha creado la etiqueta “data” (apuntando a nuestro dataset) y al etiqueta “mark” pero con valor null. Vamos a introducir el siguiente código:
{
"data": {"name": "dataset"},
"mark": "bar",
"encoding": {
"y": {
"field": "Tweets",
"type": "quantitative"
},
"x": {
"field": "Categoria",
"type": "nominal",
"axis": {
"labelFontSize": 12
}
}
}
}Simplemente le hemos indicado:
- Que la etiqueta “mark” que indica el tipo de gráfico es tipo barras (“bar“).
- Que en el eje Y queremos mostrar el valor “Tweets” cuantitativo y en el eje X el campo “Categoria” que es nominal. Para ello, usamos la etiqueta “encoding“, que nos permite relacionar parámetros de la visual con los campos del dataset.
- Hemos indicado un tamaño de fuente de 12 pixels en el eje X.
Si pulsamos en el icono triangular de play en la parte superior del “Visual Editor” veremos a la izquierda el gráfico que acabamos de crear:

Fácil, ¿no? Pero esto ya lo podíamos hacer con una visual estándar de columnas en Power BI. Vamos a realizar un gráfico más avanzado.
Dando un paso más: las capas
La etiqueta “layer” nos permite crear varios tipos de gráficos o “mark” en la misma visual.
Para ello, primero vamos a sustituir nuestro valor de “mark”: de “bar” a “line” y le vamos a añadir un “encoding” para relacionarlo con el campo “Gender”:
{
"data": {"name": "dataset"},
"encoding": {
"y": {
"field": "Tweets",
"type": "quantitative"
},
"x": {
"field": "Categoria",
"type": "nominal",
"axis": {
"labelFontSize": 12
}
}
},
"layer": [
{
"mark": "line"
}
]
}
El resultado de este código Vega-Lite debería ser el siguiente:

Como veis, la etiqueta “layer” no ha cambiado nada. Sólo hemos cambiado el tipo de gráfico de barras a línea cambiando el valor de “mark” de “bar” a “line“. Vamos a dar un poco de formato a nuestra línea. Dentro de nuestra etiqueta “mark” incluiremos:
- Un “encoding” con “detail” para realizar un stack o acumulado por Género.
- Una etiqueta “Color” para darle un color gris a la línea.
{
"data": {"name": "dataset"},
"encoding": {
"y": {
"field": "Tweets",
"type": "quantitative"
},
"x": {
"field": "Categoria",
"type": "nominal",
"axis": {
"labelFontSize": 12
}
}
},
"layer": [
{
"mark": "line",
"encoding": {
"detail": {
"field": "Categoria",
"type": "nominal"
},
"color": {"value": "#B3B3B4"}
}
}
]
}Como veis, ahora muestra un gráfico con líneas verticales por cada categoría que unen el numero de tweets de hombres y mujeres para esa categoría:

Al tener una etiqueta “layer” podemos introducir otra etiqueta “mark”, en este caso, vamos a añadir unos círculos en los extremos de nuestras líneas y les daremos diferente color en función del género a través de la etiqueta “color“:
{
"data": {"name": "dataset"},
"encoding": {
"y": {
"field": "Tweets",
"type": "quantitative"
},
"x": {
"field": "Categoria",
"type": "nominal",
"axis": {
"labelFontSize": 12
}
}
},
"layer": [
{
"mark": "line",
"encoding": {
"detail": {
"field": "Categoria",
"type": "nominal"
},
"color": {"value": "#B3B3B4"}
}
},
{
"mark": {
"type": "point",
"filled": true,
"tooltip": true
},
"encoding": {
"color": {
"field": "Gender",
"type": "ordinal",
"scale": {
"range": ["#110B93", "#CA63BD"]
},
"title": "Género"
},
"size": {"value": 300},
"opacity": {"value": 1}
}
}
]
}El resultado ya es el gráfico final que buscábamos:

En esta visual podemos ver el número de tweets por categoría de Propósito de Año Nuevo y analizar claramente en cuales hay más diferencia entre hombres y mujeres (“Crecimiento Personal”, “Humor” y “Salud y Ejercicio”).
Si le añadimos una visual de filtro por “Estado” (geografía), ponemos una imagen de fondo y le damos un poco de formato tenemos el informe que queríamos y presentábamos en el inicio del tutorial:
Recordad que si estáis suscritos a nuestra newsletter mensual (es gratis) podéis descargar e pbix original de este tutorial y del resto de posts de nuestro blog.
Siguiente paso: Tooltips + Deneb
En el próximo tutorial usaremos este primer informe en Deneb para añadirle Tooltips y ver si funcionan de manera interactiva en la visual declarativa de Deneb. ¿Qué creéis? ¿funcionará?
Conclusiones
Como veis, esta visual de Deneb nos da mucha flexibilidad para crear nuestra propias visuales (incluso más que Charticulator seguramente). De momento sólo estamos empezando a usar Vega-Lite y aún veremos otros tutoriales con opciones increíbles.
¿Qué os ha parecido? ¿Lo habíais usado ya en vuestros informes? Podéis dejar vuestros pensamientos y dudas en los comentarios de este post.







Hola Iván
Mil gracias por compartir estos conocimientos de forma tan altruista.
Contigo aprendí Charticulator y ahora estoy comenzando con Deneb (Vega-Lite).
Gracias por todo, saludos y un abrazo.
Gracias Alex! Es increíble oír que los tutoriales le están sirviendo a alguien para seguir avanzando. Y más si es alguien con tu nivel!! ;) Soy fan de tus informes!!
Brutal, muchas gracias!
Una duda, cómo se podría definir el mínimo y máximo del eje? Disculpa mi ignorancia!
Hola Juan,
gracias por tu comentario! Puedes usar la etiqueta “scale” y “domain” para definir los valores máximo y mínimo del eje.
Te adjunto un ejemplo de la documentación oficial de Vega-Lite: https://vega.github.io/vega-lite/docs/scale.html#example-customizing-domain-for-a-time-scale
¡Espero que te sirva!