Monitoring Visualizations Feature
Overview
Added optional visualization capabilities to exercises, allowing custom monitoring dashboards to appear below validation reports.
What Was Added
1. New File: R/visualization_helpers.r
Reusable visualization components:
metric_card()- Percentage metric with color coding:- 🟢 Green (≥80%) - Good
- 🟡 Yellow (50-79%) - Needs attention
- 🔴 Red (<50%) - Critical
breakdown_card()- Categorical data breakdown with horizontal bar chartsosm_monitoring_dashboard()- Complete OSM monitoring overviewbcm_monitoring_dashboard()- BCM helpdesk validation monitoringtime_metric_card()- Time-based metrics with average, median, rangesatisfaction_metric_card()- Binary satisfaction metrics
2. Updated: exercises/osm_survey.r
Added visualizations() function that displays:
📍 Accessibility & Infrastructure
- Public transportation access
- Physical disability access
- Sun/rain protection
🚿 WASH Facilities
- Breakdown of available facilities (toilet, soap, water)
🪑 Site Amenities
- Seating arrangements (waiting area, counseling space)
👁️ WFP Visibility & Communication
- WFP banners/posters visibility
- WFP Hotline cards availability
- CP staff joint visibility materials
3. Updated: exercises/bcm_survey.r
Added visualizations() function that displays:
⏱️ Service Time Metrics
- Average waiting time (with range and median)
- Average process time (with range and median)
- Color-coded: 🟢 ≤10min, 🟡 10-20min, 🔴 >20min
😊 Beneficiary Satisfaction
- Treated respectfully
- Satisfied with validation process
- Know validation result
👤 User Experience
- Comfortable using equipment
- Difficulty locating station
📊 Demographics & Communication
- Gender distribution
- How beneficiaries learned about validation
4. Updated: app/app.r
- Sources
visualization_helpers.r - Renders visualizations below validation report
- Both OSM and BCM now have custom dashboards
How It Works
# In exercise definition
exercise <- list(
# ... metadata, fetch_data, prepare_data, validations ...
# Optional visualizations
visualizations = function(data) {
osm_monitoring_dashboard(data)
}
)When a user selects an exercise:
- ✅ Data is fetched and validated
- ✅ Validation report is displayed
- ✅ If exercise has
visualizations(), it’s rendered below the report
Visual Design
- Metric Cards: Clean percentage display with color coding
- Breakdown Cards: Horizontal bar charts with percentages
- Responsive Layout: Uses Bootstrap grid (3-column for metrics)
- Modern Styling: Box shadows, border radius, gradient bars
Benefits
✅ Self-Contained
Each exercise can define its own visualizations specific to its data structure
✅ Flexible Design
Each exercise has its own dashboard tailored to its data (OSM for site monitoring, BCM for service quality)
✅ Reusable Components
metric_card() and breakdown_card() can be used by any exercise
✅ Flexible
Exercises can use helpers or create completely custom visualizations
Example Outputs
OSM Survey (91 records)
Site Monitoring Overview
Accessibility & Infrastructure
┌────────────────────────┬────────────────────────┬────────────────────────┐
│ Public Transportation │ Physical Disability │ Sun/Rain Protection │
│ 87.9% │ 72.5% │ 98.9% │
│ 80/91 sites │ 66/91 sites │ 90/91 sites │
└────────────────────────┴────────────────────────┴────────────────────────┘
WASH Facilities
┌──────────────────────────────────────────────────────────────┐
│ toilet soap water ████████████████░░░░ 42 (46.2%) │
│ toilet water soap ██████████░░░░░░░░░ 23 (25.3%) │
│ toilet ████░░░░░░░░░░░░░ 9 (9.9%) │
│ ... │
└──────────────────────────────────────────────────────────────┘
[And more sections...]
BCM Survey (69 records)
Helpdesk Validation Monitoring
Service Time Metrics
┌────────────────────────┬────────────────────────┐
│ Average Waiting Time │ Average Process Time │
│ 5.2min │ 5.4min │
│ Range: 0-10 min │ Range: 2-10 min │
│ median: 5min │ median: 5min │
└────────────────────────┴────────────────────────┘
Beneficiary Satisfaction
┌────────────────────┬────────────────────┬────────────────────┐
│ Treated │ Satisfied with │ Know Validation │
│ Respectfully │ Process │ Result │
│ 100% │ 100% │ 100% │
└────────────────────┴────────────────────┴────────────────────┘
[And more sections...]
Data-to-Question Mapping
OSM Exercise
| Question | Column | Visualization |
|---|---|---|
| Is site accessible by public transportation? | site_access |
Metric card |
| Is infrastructure accessible for disabilities? | site_infra |
Metric card |
| Is site shaded? | site_shade |
Metric card |
| Which WASH facilities available? | site_wash |
Breakdown card |
| Seating arrangements? | site_seating |
Breakdown card |
| WFP banners visible? | wfp_banners |
Metric card |
| WFP Hotline cards available? | wfp_cards |
Metric card |
| CP staff joint visibility? | joint_visibility |
Metric card |
BCM Exercise
| Question/Metric | Column | Visualization |
|---|---|---|
| Average waiting time | Q4_2_waitingtime |
Time metric card |
| Average process time | Q4_3_processtime |
Time metric card |
| Treated respectfully | Q4_1_were_trated_respectfully |
Satisfaction metric |
| Satisfied with validation process | Q4_2_satisfied_w_validation_process |
Satisfaction metric |
| Know validation result | Q4_4_know_validation_result |
Satisfaction metric |
| Comfortable using equipment | Q4_3_comfortable_using_validation_equip |
Satisfaction metric |
| Difficulty locating station | Q2_3_difficulty_locating_validationstation |
Metric card (inverted) |
| Gender distribution | Q2_1_gender |
Breakdown card |
| How learned about validation | Q2_1_how_did_you_know_about_validation |
Breakdown card |
Adding to New Exercises
Use existing helpers:
visualizations = function(data) { tagList( h3("My Custom Dashboard"), fluidRow( column(4, metric_card(data, "my_column", "My Metric")), column(8, breakdown_card(data, "categories", "Categories")) ) ) }Or create custom viz:
visualizations = function(data) { # Use any R viz library: ggplot2, plotly, etc. # Return Shiny HTML elements }Or skip it:
# Simply don't define visualizations - exercise works fine without!
Testing
# Verify it loads
cd app
Rscript -e "source('R/visualization_helpers.r'); cat('✓ Loaded\n')"
# Check exercises
Rscript -e "
source('R/visualization_helpers.r')
source('R/exercise_registry.r')
exercises <- load_exercises()
cat('OSM has viz:', !is.null(exercises[['5373']]$visualizations), '\n')
cat('BCM has viz:', !is.null(exercises[['5387']]$visualizations), '\n')
"Future Enhancements
- Interactive charts with plotly
- Time-series visualizations for monitoring trends
- Export visualizations as PNG/PDF
- Drill-down capabilities
- Comparative views across exercises
References
- OSM monitoring questions mapped to visualizations
- Bootstrap grid system for responsive layout
- Shiny tagList for dynamic UI composition