429 lines
14 KiB
Markdown
429 lines
14 KiB
Markdown
# Globe Visualization 6: Global University Rankings & Research Output
|
|
|
|
**Interactive Filtering & Data-Driven Exploration - Iteration 6**
|
|
|
|
This is the sixth iteration in a progressive web-enhanced learning series demonstrating advanced Mapbox GL JS techniques with globe projection. This iteration focuses on **interactive filtering and UI controls** for exploring global research data.
|
|
|
|
## 🌍 Theme: Global University Rankings & Research Output
|
|
|
|
This visualization showcases the world's top 120 research universities with comprehensive metrics:
|
|
|
|
- **Rankings**: Global positioning from #1 to #120
|
|
- **Research Score**: Composite measure of research excellence (55-99)
|
|
- **Publications**: Annual research output (5,500-19,800 papers)
|
|
- **Citations**: Total academic citations (122K-456K)
|
|
- **Research Funding**: Annual funding in millions ($400M-$4,200M)
|
|
- **Nobel Prizes**: Total laureates affiliated with institution (0-161)
|
|
|
|
## 📚 Learning Progression
|
|
|
|
### Previous Iterations:
|
|
1. **Iteration 1**: Population circles - Basic globe setup
|
|
2. **Iteration 2**: Temperature heatmap - Color gradients
|
|
3. **Iteration 3**: Economic data - Advanced expressions
|
|
4. **Iteration 4**: Digital infrastructure - Multi-layer composition
|
|
5. **Iteration 5**: (Educational theme foundation)
|
|
6. **Iteration 6** (this): Interactive filtering & UI controls
|
|
|
|
## 🔬 Web-Enhanced Learning
|
|
|
|
**Research Source**: Mapbox GL JS Filter Markers Example
|
|
**URL**: https://docs.mapbox.com/mapbox-gl-js/example/filter-markers/
|
|
|
|
### Key Filtering Techniques Learned and Applied:
|
|
|
|
#### 1. **Layer-Based Filtering with setFilter()**
|
|
From the web source, I learned to use `map.setFilter()` to dynamically control which features are rendered:
|
|
|
|
```javascript
|
|
// Apply complex filter expression to layer
|
|
map.setFilter('universities-layer', filterExpression);
|
|
```
|
|
|
|
This is the core filtering mechanism that updates the visualization in real-time based on user selections.
|
|
|
|
#### 2. **Filter Expression Patterns**
|
|
The web source demonstrated several filter expression types that I implemented:
|
|
|
|
**Equality Filtering** (`==`):
|
|
```javascript
|
|
['==', 'icon', symbol] // From web source
|
|
['==', 'region', selectedRegion] // My application
|
|
```
|
|
|
|
**Range Filtering** (`<=`, `>=`):
|
|
```javascript
|
|
// My implementation for ranking and metric thresholds
|
|
['<=', ['get', 'ranking'], maxRanking]
|
|
['>=', ['get', 'publications'], minPublications]
|
|
```
|
|
|
|
**Compound Filtering** (`all`, `in`):
|
|
```javascript
|
|
// Combining multiple conditions
|
|
filterExpression = ['all',
|
|
['in', ['get', 'region'], ['literal', selectedRegions]],
|
|
['<=', ['get', 'ranking'], 120],
|
|
['>=', ['get', 'publications'], minPubs]
|
|
];
|
|
```
|
|
|
|
#### 3. **UI Control Implementation**
|
|
The web source showed checkbox-based layer visibility toggling. I expanded this to include:
|
|
|
|
**Checkbox Filters** (from web source pattern):
|
|
```javascript
|
|
checkbox.addEventListener('change', () => {
|
|
// Update filter state
|
|
applyFilters();
|
|
});
|
|
```
|
|
|
|
**Range Sliders** (my enhancement):
|
|
```javascript
|
|
slider.addEventListener('input', (e) => {
|
|
currentFilters.minValue = parseInt(e.target.value);
|
|
applyFilters();
|
|
});
|
|
```
|
|
|
|
#### 4. **Dynamic Layer Updates**
|
|
Learned from web source that filters can be changed without reloading data:
|
|
```javascript
|
|
// Efficient re-filtering without data reload
|
|
map.setFilter('layer-id', newFilterExpression);
|
|
```
|
|
|
|
This enables smooth, real-time filtering as users adjust controls.
|
|
|
|
#### 5. **Query Rendered Features for Statistics**
|
|
Extended the pattern to calculate statistics on filtered data:
|
|
```javascript
|
|
const features = map.queryRenderedFeatures({
|
|
layers: ['universities-layer']
|
|
});
|
|
// Calculate aggregate statistics from visible features
|
|
```
|
|
|
|
## 🎯 Advanced Filtering Features
|
|
|
|
### Multi-Criteria Filtering System
|
|
|
|
**Region Filters** (Checkbox-based):
|
|
- North America (27 universities)
|
|
- Europe (25 universities)
|
|
- Asia-Pacific (42 universities)
|
|
- Middle East (9 universities)
|
|
- Africa (6 universities)
|
|
- Latin America (11 universities)
|
|
- All (default - 120 universities)
|
|
|
|
**Ranking Range** (Slider):
|
|
- Filter by top N universities (10, 20, 30...120)
|
|
- Dynamic adjustment from elite tier to broader selection
|
|
|
|
**Publications Threshold** (Slider):
|
|
- Filter by minimum annual research output
|
|
- Range: 0 to 20,000 publications
|
|
- Step: 1,000 publications
|
|
|
|
**Citations Threshold** (Slider):
|
|
- Filter by minimum total citations
|
|
- Range: 0 to 500,000 citations
|
|
- Step: 25,000 citations
|
|
|
|
**Research Funding** (Slider):
|
|
- Filter by minimum annual funding
|
|
- Range: $0M to $4,500M
|
|
- Step: $100M
|
|
|
|
**Nobel Prizes** (Slider):
|
|
- Filter by minimum Nobel laureates
|
|
- Range: 0 to 161 prizes
|
|
- Step: 5 prizes
|
|
|
|
### Interactive Controls
|
|
|
|
**Reset Filters**: One-click restoration of all filters to default state
|
|
|
|
**Pause/Resume Rotation**: Toggle auto-rotation for detailed examination
|
|
|
|
## 🎨 Visual Design
|
|
|
|
### Color-Coded Research Excellence
|
|
|
|
Universities are colored by **Research Score** using an 8-stop gradient:
|
|
|
|
- **95-99** (Royal Blue `#0066ff`): Exceptional - MIT, Harvard, Oxford, Cambridge
|
|
- **90-94** (Deep Sky Blue `#00bfff`): Outstanding - Top 20 institutions
|
|
- **85-89** (Lime Green `#32cd32`): Excellent - Top 30-40
|
|
- **80-84** (Gold `#ffd700`): Very Good - Top 50
|
|
- **75-79** (Orange `#ffa500`): Good - Top 60-70
|
|
- **70-74** (Tomato `#ff6347`): Above Average - Top 80
|
|
- **65-69** (Crimson `#dc143c`): Average - Top 100
|
|
- **55-64** (Deep Red `#8b0000`): Emerging - Top 120
|
|
|
|
### Size-Coded Rankings
|
|
|
|
Circle radius inversely proportional to ranking (better rank = larger):
|
|
- **Rank 1-10**: 14-18px radius (Largest - most prominent)
|
|
- **Rank 11-25**: 11-14px radius
|
|
- **Rank 26-50**: 9-11px radius
|
|
- **Rank 51-75**: 7-9px radius
|
|
- **Rank 76-100**: 5-7px radius
|
|
- **Rank 101-120**: 4-5px radius (Smallest)
|
|
|
|
### Dynamic Labels
|
|
|
|
Top 30 universities display text labels with:
|
|
- Name overlay on hover
|
|
- Size scaled by ranking (9-13px)
|
|
- White text with black halo for readability
|
|
- Smart placement to avoid overlap
|
|
|
|
## 📊 Comprehensive Data Model
|
|
|
|
### University Properties
|
|
|
|
Each of the 120 universities includes:
|
|
|
|
```javascript
|
|
{
|
|
name: "University Name",
|
|
country: "Country",
|
|
region: "Region",
|
|
ranking: 1-120, // Global position
|
|
publications: 5500-19800, // Annual research papers
|
|
citations: 122000-456000, // Total citations
|
|
funding: 400-4200, // Annual funding ($M)
|
|
nobelPrizes: 0-161, // Total Nobel laureates
|
|
researchScore: 55-99 // Composite excellence score
|
|
}
|
|
```
|
|
|
|
### Regional Distribution
|
|
|
|
- **Asia-Pacific**: 42 universities (35%)
|
|
- **North America**: 27 universities (22.5%)
|
|
- **Europe**: 25 universities (21%)
|
|
- **Latin America**: 11 universities (9%)
|
|
- **Middle East**: 9 universities (7.5%)
|
|
- **Africa**: 6 universities (5%)
|
|
|
|
### Top 10 Universities Highlighted
|
|
|
|
1. **MIT** (USA) - Research Score: 98
|
|
2. **Stanford** (USA) - Research Score: 97
|
|
3. **Harvard** (USA) - Research Score: 99 | Nobel Prizes: 161
|
|
4. **UC Berkeley** (USA) - Research Score: 96 | Nobel Prizes: 110
|
|
5. **Cambridge** (UK) - Research Score: 97 | Nobel Prizes: 121
|
|
6. **Oxford** (UK) - Research Score: 98 | Nobel Prizes: 72
|
|
7. **Imperial College** (UK) - Research Score: 94
|
|
8. **UCLA** (USA) - Research Score: 93
|
|
9. **Columbia** (USA) - Research Score: 94 | Nobel Prizes: 101
|
|
10. **UCL** (UK) - Research Score: 93
|
|
|
|
## 🔧 Technical Implementation
|
|
|
|
### Filter Expression Architecture
|
|
|
|
The filtering system uses Mapbox's expression syntax with compound conditions:
|
|
|
|
```javascript
|
|
let filterExpression = ['all']; // AND operator for multiple conditions
|
|
|
|
// Region filter (OR within selected regions)
|
|
if (selectedRegions.length > 0) {
|
|
filterExpression.push([
|
|
'in',
|
|
['get', 'region'],
|
|
['literal', selectedRegions]
|
|
]);
|
|
}
|
|
|
|
// Ranking filter (less than or equal to max)
|
|
filterExpression.push(['<=', ['get', 'ranking'], maxRank]);
|
|
|
|
// Publication threshold (greater than or equal to min)
|
|
filterExpression.push(['>=', ['get', 'publications'], minPubs]);
|
|
|
|
// Apply to layer
|
|
map.setFilter('universities-layer', filterExpression);
|
|
```
|
|
|
|
### Real-Time Statistics Calculation
|
|
|
|
After each filter update, statistics are recalculated from visible features:
|
|
|
|
```javascript
|
|
function updateStatistics() {
|
|
const features = map.queryRenderedFeatures({
|
|
layers: ['universities-layer']
|
|
});
|
|
|
|
const count = features.length;
|
|
const avgResearch = features.reduce((sum, f) =>
|
|
sum + f.properties.researchScore, 0) / count;
|
|
const totalPubs = features.reduce((sum, f) =>
|
|
sum + f.properties.publications, 0);
|
|
const totalCitations = features.reduce((sum, f) =>
|
|
sum + f.properties.citations, 0);
|
|
const totalNobel = features.reduce((sum, f) =>
|
|
sum + f.properties.nobelPrizes, 0);
|
|
|
|
// Update UI displays
|
|
}
|
|
```
|
|
|
|
### Interactive Popup Information
|
|
|
|
Hover over any university to see detailed metrics:
|
|
- University name and location
|
|
- Global ranking and research score
|
|
- Publications and citations
|
|
- Research funding
|
|
- Nobel Prize count
|
|
|
|
## 🎓 Key Improvements Over Previous Iterations
|
|
|
|
### From Web Research:
|
|
1. **Dynamic filtering** using `setFilter()` method
|
|
2. **Compound filter expressions** with `all`, `in`, `>=`, `<=` operators
|
|
3. **Checkbox-based UI controls** for categorical filtering
|
|
4. **Real-time layer updates** without data reloading
|
|
5. **Feature querying** for statistics calculation
|
|
|
|
### My Enhancements:
|
|
1. **Multi-dimensional filtering** (6 independent criteria)
|
|
2. **Range sliders** for continuous metrics
|
|
3. **Coordinated filter state** management
|
|
4. **Live statistics dashboard** updating with filters
|
|
5. **Mutual exclusivity** for "All" vs specific region selection
|
|
6. **Reset functionality** for user convenience
|
|
7. **Comprehensive research dataset** (120 universities, 6 metrics each)
|
|
|
|
### Progressive Learning Synthesis:
|
|
- **Iteration 1-3 foundations**: Circle styling, color gradients, expressions
|
|
- **Iteration 4 multi-layer**: Layer composition techniques
|
|
- **Iteration 6 innovation**: Interactive filtering and exploration UI
|
|
|
|
## 🚀 Usage
|
|
|
|
1. **Open** `index.html` in a modern web browser
|
|
2. **Explore** the globe - drag, zoom, rotate to navigate
|
|
3. **Filter by Region** - Select one or more geographic regions
|
|
4. **Adjust Ranking** - Use slider to focus on top N universities
|
|
5. **Filter by Metrics** - Set minimum thresholds for publications, citations, funding, Nobel prizes
|
|
6. **View Statistics** - Live dashboard shows aggregate metrics for filtered selection
|
|
7. **Hover Universities** - Detailed popup with all metrics
|
|
8. **Reset** - Clear all filters with one click
|
|
9. **Control Rotation** - Pause/resume auto-rotation as needed
|
|
|
|
## 📁 Project Structure
|
|
|
|
```
|
|
mapbox_globe_6/
|
|
├── index.html # Main visualization with UI controls
|
|
├── src/
|
|
│ ├── index.js # Filtering logic and interactivity
|
|
│ └── data/
|
|
│ └── data.js # 120 universities with 6 metrics each
|
|
├── README.md # This documentation
|
|
└── CLAUDE.md # Development context
|
|
```
|
|
|
|
## 🎯 Web Research Integration Quality
|
|
|
|
### Source Attribution
|
|
- **Technique**: Filter markers/features by property values
|
|
- **Original Example**: Checkbox toggles for icon-based filtering
|
|
- **Adaptation**: Extended to multi-criteria, multi-type filtering system
|
|
- **Novel Synthesis**: Combined checkbox, slider, and compound expression patterns
|
|
|
|
### Progressive Learning Demonstrated
|
|
- **Previous**: Static visualizations, pre-filtered data
|
|
- **This Iteration**: Dynamic, user-controlled exploration
|
|
- **Improvement**: Interactive filtering enables data-driven discovery
|
|
- **Innovation**: 6-dimensional filtering space for research data
|
|
|
|
### Mapbox Best Practices Applied
|
|
✅ Efficient filter expressions (no data reloading)
|
|
✅ Feature querying for dynamic statistics
|
|
✅ Proper use of `all`, `in`, `>=`, `<=` operators
|
|
✅ UI responsiveness with live updates
|
|
✅ Layer-based filtering with `setFilter()`
|
|
✅ Clean separation of data, logic, and presentation
|
|
|
|
## 🔍 Use Cases
|
|
|
|
**Research Policy Makers**: Identify universities meeting specific funding and output criteria
|
|
|
|
**Prospective Students**: Explore institutions by region and research strength
|
|
|
|
**Academic Collaborators**: Find universities with strong citation impact
|
|
|
|
**Funding Agencies**: Analyze research output patterns by geographic distribution
|
|
|
|
**University Administrators**: Benchmark against peer institutions across multiple metrics
|
|
|
|
## 📈 Statistics Dashboard
|
|
|
|
Real-time metrics update with every filter adjustment:
|
|
|
|
- **Universities**: Count of currently visible institutions
|
|
- **Avg Research Score**: Mean excellence score of filtered set
|
|
- **Total Publications**: Sum of annual research output
|
|
- **Total Citations**: Aggregate citation impact
|
|
- **Total Nobel Prizes**: Sum of laureates across filtered universities
|
|
|
|
## 🌟 Key Takeaways
|
|
|
|
### Technical Mastery:
|
|
- Complex filter expression composition
|
|
- Multi-criteria filtering architecture
|
|
- Real-time feature querying and aggregation
|
|
- Coordinated UI state management
|
|
- Dynamic statistics calculation
|
|
|
|
### Visual Excellence:
|
|
- 8-stop color gradient for research scores
|
|
- Inverse size scaling for rankings
|
|
- Professional dark theme with glassmorphism
|
|
- Responsive layout for mobile and desktop
|
|
- Clear legends and intuitive controls
|
|
|
|
### Educational Value:
|
|
- Demonstrates practical filtering patterns from Mapbox docs
|
|
- Shows extension from simple to complex filtering
|
|
- Illustrates data-driven exploration workflows
|
|
- Provides reusable filtering architecture
|
|
|
|
### Progressive Learning:
|
|
- **Wave 1 (Iter 1-5)**: Foundation building
|
|
- **Wave 2 (Iter 6-12)**: Enhancement & styling ← **We are here**
|
|
- Next: More sophisticated interactions, animations, advanced UI patterns
|
|
|
|
---
|
|
|
|
*This iteration demonstrates mastery of interactive filtering techniques from Mapbox documentation, applied to a rich educational research dataset with multi-dimensional exploration capabilities.*
|
|
|
|
## 🔗 Web Source Reference
|
|
|
|
**Mapbox GL JS Filter Markers Example**
|
|
https://docs.mapbox.com/mapbox-gl-js/example/filter-markers/
|
|
|
|
**Key Concepts Learned:**
|
|
- Filter expressions syntax
|
|
- Dynamic layer filtering with `setFilter()`
|
|
- Checkbox-based UI controls
|
|
- Real-time visibility updates
|
|
- Feature property access with `['get', 'property']`
|
|
|
|
**Applied & Extended:**
|
|
- Multiple filter types (checkbox, slider)
|
|
- Compound expressions with `all` operator
|
|
- Range-based filtering (`>=`, `<=`)
|
|
- Multi-value filtering with `in` operator
|
|
- Statistics calculation on filtered data
|
|
- Coordinated filter state management
|