A universal CSV data visualization tool for Meta Quest built with Unity and OpenXR. Transform any spreadsheet data into interactive 3D scatter plots in Virtual and Augmented Reality.
Traditional 2D charts struggle to represent relationships in multi-dimensional data. VR DataViz solves this by mapping data to 3D space where users can physically walk around their data, grab and reposition visualizations, and annotate insights directly in space.
Built for fun and as a portfolio project demonstrating XR development, data visualization, and interactive system design. I took quite a few data science courses this semester and I wanted a tool like this to visualize my data in space and analyze it in depth.
Itch.io : https://sketcherex.itch.io/vr-dataviz
Other projects: https://anjali-kanvinde.vercel.app/
Anjali Kan
LinkedIn: https://www.linkedin.com/in/anjali-kanvinde
Portfolio: https://anjali-kanvinde.vercel.app/
GitHub: https://github.com/Anjali-Kan
- Load any CSV with automatic numeric vs categorical column detection. Can handle upto 6K datapoints and I am working on increasing this capacity.
- Dynamically map columns to X, Y, Z spatial axes
- Color encoding with gradients for numeric data and distinct colors for categories
- Axis labels update to reflect mapped column names
- Normalized scaling ensures all data fits within viewable bounds
- Hover tooltips display all column values for any data point
- Grab and reposition the entire visualization in space
- Real-time filtering with min/max range controls per column
- Reset view returns visualization to original position
- Draw 3D annotations directly around data points
- Annotations are parented to visualization and move with it
- Undo last drawing or clear all annotations
- Drawings persist through save/load
- Save complete state: position, axis mapping, filters, annotations
- Load previously saved views
- Toggle between VR mode and AR passthrough
XR Interaction Toolkit had compatibility issues with Unity 6, so I built a custom solution using physics raycasts to detect canvas hits, then GraphicRaycaster to find specific UI elements. This handles hover states, click events, and proper button interactions.
Annotations use local-space positioning relative to the visualization root. When users grab and move the visualization, all annotations move correctly. New drawings after repositioning still appear at the controller location relative to the moved coordinate system.
CSV parsing handles quoted fields containing commas, missing values, and automatic type detection by sampling rows. Numeric columns store min/max for normalization. Categorical columns store unique values for color mapping.
Includes a Lorenz attractor dataset — a classic example of a chaotic dynamical system. The data consists of a few thousand 3D points (x,y,z) sampled over time, forming a distinctive butterfly-shaped structure. When visualized as a point cloud, the dataset highlights depth, continuity, and spatial structure, making it well-suited for immersive 3D exploration and performance-constrained WebGL rendering.
Also includes this classic machine learning dataset with 150 samples of 3 flower species. When visualized with Petal Length, Petal Width, and Sepal Length on axes and Species as color, three distinct clusters emerge demonstrating the natural groupings in the data. We can clearly visualise the clusters and how distinct they are from each other.
- Unity 6 (6000.x)
- OpenXR
- XR Interaction Toolkit
- C#
- Meta Quest 2/3/3S/Pro
Scripts/
Core/
CSVParser.cs - Parses CSV with quote handling
DataSet.cs - Column analysis and normalization
DataManager.cs - Singleton data loader
SaveLoadManager.cs - JSON serialization of view state
ARToggle.cs - VR/AR mode switching
Visualization/
CoordinateSystem.cs - 3D axes, grid lines, labels
PointCloudRenderer.cs - Generates colored data points
Interaction/
VRUIPointer.cs - Custom VR UI raycasting
DataPointInteraction.cs- Hover detection and tooltips
VisualizationGrabber.cs- Grab and move system
VRDrawing.cs - 3D line drawing
UI/
AxisMappingUI.cs - Axis selection controls
FilterPanel.cs - Data range filtering
Singleton Pattern for DataManager and SaveLoadManager provides global access to shared state without tight coupling.
Event-Driven Loading using C# events (OnDataLoaded) allows visualization and UI components to react to data changes without direct dependencies.
Component Composition keeps each script focused on one responsibility. Interaction behaviors are separate components attached to controllers.
Local Space Rendering for LineRenderers ensures annotations move correctly with parent transforms rather than staying fixed in world space.
| Action | Quest Controller | Editor Simulator |
|---|---|---|
| Point and Select | Aim + Trigger | Mouse + Left Click |
| Grab Visualization | Grip Button | G Key |
| Draw Annotation | Trigger (hold) | F Key (hold) |
| Move | Thumbstick | WASD |
- Clone repository
- Open in Unity 6
- Open Assets/Scenes/DataVizMainScene
- Build to Quest or test with XR Device Simulator
- Place CSV file in Assets/StreamingAssets/
- Select DataManager in Hierarchy
- Change Default File Name to your file
- CSV must have headers in first row
- Multi-user collaboration for shared data exploration
- Voice commands for hands-free axis selection
- ML integration showing PCA or clustering results
- Support for larger datasets with LOD system
MIT




