Graficar en Dashboards resultados de una pregunta de selección múltiple en Survey123 con Arcade

1277
3
08-30-2024 04:09 PM
XanderBakker
Esri Esteemed Contributor
6 3 1,277

Preguntas de selección múltiple en Survey123

Cuando en una encuesta usamos preguntas de tipo selección múltiple el resultado se guarda en un campo de texto donde los ítems seleccionados se separen con una coma. En el ejemplo abajo el resultado se almacena como “Reducción del CO2 emitido,Ahorro en costos de energía electrica”:

Dashboard - pregunta selección múltiple.png

Si visualizamos la información en un gráfico de barras el resultado puede verse así y no nos informe de manera fácil cual respuesta es más frecuente:

Dashboard - grafico original.png

Con una expresión de datos en Arcade es posible crear un conjunto de datos (featureset) en memoria y usar estos datos para un elemento en ArcGIS Dashboards. Al agregar un elemento de “Gráfico de serie” abre la ventana donde debemos seleccionar la capa para alimentar el elemento. En este caso seleccionamos “Nueva expresión de datos”:

Dashboard - nueva expresión de datos.png

En el editor de Arcade se puede notar que para una expresión de datos no hay variables de perfil:

Dashboard - no tiene variables.png

Es necesario conectarnos a la capa de la encuesta, analizar los datos, crear un esquema para el resultado del análisis y, llenar el esquema y devolverlo como featureset.

Una explicación de la expresión Arcade que se puede encontrar al final de este artículo:

  • Línea 2: definir el portal donde están los datos
  • Línea 3: definir una consultar para filtrar datos de interés
  • Línea 4: acceder a la capa de la encuesta y filtrar los datos con la consulta definida
  • Línea 6 a 22: crear un diccionario para almacenar los resultados, recorrer cada registro de la encuesta, separar los motivos de la respuesta de selección múltiple y almacenar el conteo de cada motivo.
  • Línea 24 a 30: crear un esquema de datos con 2 campos y sin geometría. Un campo para registrar el motivo y otro campo para almacenar el conteo
  • Línea 32 a 40: leer los resultados del diccionario y escribirlos al esquema de datos generado anteriormente
  • Línea 43: Devolver el esquema (diccionario) como featureset

Al ejecutar la expresión se obtiene un featureset con cada motivo separado y con su respectivo conteo:

Dashboard - featurset resultado.png

Así el gráfico que resulta es más fácil de interpretar:

Dashboard - grafico resultado.png

 

El código Arcade

// 1: acceder a la capa de proyectos
var spx = Portal('https://utility-esri-co.maps.arcgis.com');
var sql = "Motivo <> ''";
var proyectos = Filter(FeatureSetByPortalItem(spx, 'bf4a31341a5d49be90de6ce471a0b647', 0, ["Motivo"], false), sql);

// 2: crear estadísticas por motivo
var dct = {}; 
var conteo = 0;
for (var proyecto in proyectos) {
    var motivos = proyecto["Motivo"];
    var lst = Split(motivos, ',');
    for (var i in lst) {
        var motivo = lst[i];
        if (HasKey(dct, motivo)) {
            conteo = dct[motivo]+1;
        } else {
             conteo = 1;
        }
        dct[motivo] = conteo;
    }
}
Console(Text(dct));

// 3: crear esquema de datos para featureset el resultado
var Dict = {  
    'fields': [
        {'name': 'Motivo', 'type': 'esriFieldTypeString' },  
        {'name': 'Conteo','type': 'esriFieldTypeInteger'}],
    'geometryType': '',   
    'features': []};  

// 4: llenar esquema con el resulatdo del análisis
var index = 0;  
for (motivo in dct) {   
    Dict.features[index] = {   
            'attributes': {   
                'Motivo': motivo,
                'Conteo': dct[motivo]
            }}   
    index++; };  

// 5: convertir a FeatureSet y devolver resultado
return FeatureSet(Text(Dict));

 

3 Comments
PROYECTOPIATER2022
Occasional Explorer

Hello, thank you very much for the information; it is very useful. However, I have a small problem: when I want to perform a filter action on that graphed information, it does not allow me because it is not connected to the same layer. Is there a solution to this issue?

XanderBakker
Esri Esteemed Contributor

Hi @PROYECTOPIATER2022 

It is possible to create interactivity between normal elements in a Dashboard and those that connect to data provided by an Arcade data expression. It all depends on the connection you can establish. Make sure you have some common fields between the two elements and define the action between them.

 

Español: 

Es possible crear una acción entre un elemento definido basado en una capa y un elemento que tiene por debajo una expresión de datos de Arcade. Importante es contar con un campo en común para configurar la acción. 

EstebanAndresMerizalde
Esri Contributor

Hi Esri Community,

I wanted to share an Arcade script I developed to handle a common challenge when working with survey data in ArcGIS Dashboards: splitting multiple-choice responses (stored as comma-separated values in a single field) into independent records. This approach is useful for visualizing or analyzing each selection as a separate record in your dashboard.

Problem:

In survey data, multiple-choice questions are often stored in a single field with responses separated by commas (e.g., "Option1, Option2, Option3"). If you want to count or display each response as an independent record, it requires splitting this field into separate rows for each selection.

Solution:

This script reads the survey data, processes the multiple-choice responses, and creates a new FeatureSet where each selection becomes an individual record. It maintains a link to the original data using a Cuenta (account) field or similar identifier.

// 1: Access the survey data from a Feature Layer
var spx = Portal('https://glxecuador.maps.arcgis.com'); // Replace with your portal URL
var sql = "Apps_campo <> ''"; // Filter to include only records with responses
var proyectos = Filter(FeatureSetByPortalItem(spx, '102b59ad21644a6b97a9dfa3ba25a5c7', 0, ["Apps_campo", "Cuenta"], false), sql);

// 2: Create a schema for the output FeatureSet
var Dict = {
'fields': [
{'name': 'Motivo', 'type': 'esriFieldTypeString'}, // Field for individual selections
{'name': 'Cuenta', 'type': 'esriFieldTypeString'} // Link to original record
],
'geometryType': '',
'features': []
};

// 3: Process each record to split multiple-choice responses
var index = 0;
for (var proyecto in proyectos) {
var cuenta = proyecto["Cuenta"]; // Account/identifier field
var motivos = proyecto["Apps_campo"]; // Multiple-choice responses field
var lst = Split(motivos, ','); // Split responses by comma

for (var i in lst) {
var motivo = Trim(lst[i]); // Clean up whitespace
Dict.features[index] = {
'attributes': {
'Motivo': motivo,
'Cuenta': cuenta
}
};
index++;
}
}

// 4: Convert schema into a FeatureSet and return
return FeatureSet(Text(Dict));

Result: 

EstebanAndresMerizalde_0-1738097281650.png

EstebanAndresMerizalde_0-1738097600490.png

 

 

Contributors
About the Author
Solution Engineer for the Utilities Sector @ Esri Colombia - Ecuador - Panamá sr GIS Advisor / Python - Arcpy developer / GIS analyst / technical project leader / lecturer and GeoNet moderator, focusing on innovations in the field of GIS. Specialties: ArcGIS, Python, ArcGIS Enterprise, ArcGIS Online, Arcade, Configurable Apps, WAB, Mobile Apps, Insights, Spatial Analysis, LiDAR / 3D Laser Scanning / Point Clouds. UNME http://nl.linkedin.com/in/xanderbakker/ http://www.slideshare.net/XanderBakker http://www.scribd.com/xbakker http://twitter.com/#!/XanderBakker