WebUVisBox (Web-based Uncertainty Visualization Toolbox) is a flexible, scenario-based framework for interactive visualization of scientific uncertainty data. Built with modern web technologies, it provides powerful tools for exploring ensemble simulations, scalar fields, and uncertainty quantification.
- π¨ Interactive Visualization: Real-time 3D rendering with Three.js and React Three Fiber
- π Advanced Analytics: Integrated statistical visualizations using Chart.js and D3
- π Reactive State Management: MobX-powered reactive updates across all components
- π― Scenario-Based Architecture: Modular design supporting multiple domain-specific visualizations
- π Flexible Layout System: Drag-and-drop panel management with React Grid Layout
- π¨ Customizable Transfer Functions: Interactive colormap and opacity editors
- π Data Server Integration: Fetch and visualize remote ensemble datasets
- Frontend: React 19+ with TypeScript
- 3D Graphics: Three.js, React Three Fiber, Drei
- State Management: MobX 6.13+
- UI Components: Material-UI (MUI) v7
- Charting: Chart.js 4.5, D3.js 7.9
- Layout: React Grid Layout
- Build Tool: Vite 7
- Node.js 18+
- npm or yarn
Note: The data server backend is not provided by default with this repository. If you plan to use WebUVisBox with your own data, please email the author with details about your planned usage for inquiry. Example server code will be provided in future releases.
For development and testing, you can modify the data_server_address in scenario configuration files to point to your own data source.
# Clone the repository
git clone https://github.com/JixianLi/webuvisbox.git
cd webuvisbox
# Install dependencies
npm install# Start development server
npm run devThe application will be available at http://localhost:5173
# Build for production
npm run build
# Preview production build
npm run previewwebuvisbox/
βββ src/
β βββ Scenarios/ # Scenario plugin system
β β βββ index.ts # Scenario discovery (imports all scenarios)
β β βββ ScenarioRegistry.ts # Registry singleton
β β βββ Wildfire/ # Wildfire simulation visualization
β β β βββ index.ts # Self-registration entry point
β β β βββ WildfireGlobalContext.ts
β β β βββ Views/ # Panel components
β β βββ UncertaintyTube/ # Flow uncertainty visualization
β β βββ index.ts # Self-registration entry point
β β βββ UncertaintyTubeGlobalData.ts
β β βββ Views/ # Panel components
β βββ Renderers/ # Shared rendering components
β β βββ Colormaps/ # Color and opacity mapping
β β βββ Mesh/ # 3D mesh components
β β βββ Chartjs/ # Chart utilities
β βββ LayoutManager/ # Panel layout management
β βββ Panels/ # Reusable panel components
β βββ Types/ # TypeScript type definitions
β βββ Helpers/ # Utility functions
βββ public/
β βββ ScenarioConfigs/ # Scenario configuration files
βββ package.json
Visualize WRF-SFIRE ensemble simulations with:
- 3D terrain visualization with scalar field overlays
- Wind glyph rendering
- Contour boxplots and band depth analysis
- Interactive time navigation
- Customizable colormaps and opacity transfer functions
Explore flow field uncertainty with:
- Seed placement and trajectory visualization
- Uncertainty tube rendering
- Ensemble member path analysis
Scenarios are configured via JSON files in public/ScenarioConfigs/. Each scenario defines:
- Panel layouts (responsive grid configurations)
- Data sources and ensemble members
- Initial visualization parameters
- UI configurations
Example structure:
{
"name": "Wildfire",
"description": "WRF-SFire simulation data visualization",
"panel_layouts": { ... },
"global_data": { ... }
}- Histogram-based scalar distribution visualization
- Click to add control points
- Right-click to remove control points
- Real-time colormap updates
- Y-position represents opacity (0-1)
- Line plot shows opacity function
- Interactive control point editing
- Light gray histogram background
- Drag-and-drop panel repositioning
- Resizable panels
- Breakpoint-based layouts (xl, lg, sm)
- Panel visibility toggling
Scenarios self-register via a registry pattern. To add a new scenario:
- Create your scenario folder:
src/Scenarios/YourScenario/
βββ index.ts # Entry point (registers the scenario)
βββ YourScenarioGlobalContext.ts # State management (implements GlobalContext)
βββ yourScenarioPanelMapping.tsx # Maps panel IDs to components
βββ Views/ # Panel components
βββ YourPanel/
βββ YourPanel.tsx
- Create
index.tsto register your scenario:
import { scenarioRegistry } from "../ScenarioRegistry";
import { YourScenarioGlobalContext } from "./YourScenarioGlobalContext";
import { yourScenarioPanelMapping } from "./yourScenarioPanelMapping";
scenarioRegistry.register({
name: "Your Scenario",
description: "Description of your scenario",
createGlobalContext: () => new YourScenarioGlobalContext(),
panelMapping: yourScenarioPanelMapping,
defaultConfigPath: "ScenarioConfigs/YourScenario.json",
});- Implement
GlobalContextinterface in your GlobalContext class:
interface GlobalContext {
initialize(global_data_object: any): void;
asyncInitialize(): Promise<void>;
toObject(): any;
}-
Create configuration JSON in
public/ScenarioConfigs/YourScenario.json -
Add one import to
src/Scenarios/index.ts:
import "./YourScenario";That's it! Your scenario is now available in the application.
Panels extend the base Panel component and integrate with the MobX reactive system:
import Panel from "@/Panels/Panel";
import { observer } from "mobx-react-lite";
export const MyPanel = observer(() => {
const global_context = useScenario().global_context;
return (
<Panel panel_name="My Panel">
{/* Your content */}
</Panel>
);
});Contributions are welcome! Please feel free to submit issues and pull requests.
[Add your license information here]
This project builds upon research in uncertainty visualization and ensemble data analysis.
For questions and support, please open an issue on GitHub.