Plot Pane
A rich multi-series time-series charting pane for quantitative analysis. Each series is independently configured with its own plot type, data source, styling, and statistical overlays. The Plot pane supports dual Y-axes, threshold lines, vertical event markers, and both live and historical data backends.
SeriesConfig
| Field | Description |
|---|---|
| source_id | Data source identifier (layer or ClickHouse query) |
| x / y fields | Dot-path to the X and Y axis values in the data |
| color | Series color (hex or named) |
| plot_type | Scatter, Line, Area, or Histogram |
| line_style | Solid, Dashed, or Dotted |
| marker_shape | Point marker shape for Scatter and Line modes |
| smoothing_window | Rolling average window size for noise reduction |
| aggregate | Mean, Sum, Min, Max, or Count |
| normalize | MinMax, ZScore, or Percent normalization |
| show_trend_line | Overlay a linear regression trend line |
| show_std_bands | Display standard deviation bands around the series |
| secondary_axis | Plot this series on the right Y-axis |
| histogram_bins | Number of bins when plot_type is Histogram |
Data Sources
- LayerStore (Live): Stream real-time entity snapshots for live charting
- ClickHouse (Historical): Query archived data for long-range analysis
View Modes and Annotations
- Free: Manual pan and zoom on both axes
- Fit: Auto-fit all data into the visible area
- Follow: Sliding window that tracks the latest data in real time
- Thresholds: Horizontal lines at critical values (e.g. alarm limits)
- VLines: Vertical event markers for incidents or state changes
- Config Panel: Per-series configuration accessible from the plot toolbar
Keyboard Shortcuts
View
F
Fit all data to view R
Reset zoom to default P
Toggle pause (freeze live updates) Ctrl + L
Toggle legend visibility Ctrl + C
Toggle crosshair mode YAML Configuration
yaml PlotConfig auto-generated
| Field | Type | Default | Description |
|---|---|---|---|
| series | Vec<SeriesConfig> | [] | |
| time_window | TimeWindow | "None" | |
| max_history | usize | 2000 | |
| y_label | String | — | |
| x_label | String | — | |
| y_label_right | String | — | |
| y_range | [f64; 2] | — | |
| x_range | [f64; 2] | — | |
| y_range_right | [f64; 2] | — | |
| view_mode | ViewMode | "Fit" | |
| show_legend | bool | true | |
| show_crosshair | bool | false | |
| show_zero_line | bool | false | |
| include_x_zero | bool | false | |
| log_scale_y | bool | false | |
| thresholds | Vec<ThresholdLine> | [] | |
| vlines | Vec<VLineMarker> | [] | Vertical event markers drawn at fixed X values. |
yaml SeriesConfig auto-generated
| Field | Type | Default | Description |
|---|---|---|---|
| source_id | String | "tracks" | |
| x_field | String | "lon" | |
| y_field | String | "lat" | |
| label | String | — | |
| color | egui::Color32 | "from_rgb(50, 230, 130)" | |
| plot_type | PlotType | "Scatter" | |
| entity_filter | String | — | |
| point_radius | f32 | 3.0 | |
| line_width | f32 | 2.0 | |
| visible | bool | true | |
| line_style | SeriesLineStyle | "Solid" | |
| marker_shape | SeriesMarkerShape | "Circle" | |
| smoothing_window | usize | — | |
| aggregate | AggregateMode | "Mean" | |
| normalize | NormalizeMode | "None" | |
| show_trend_line | bool | false | |
| show_std_bands | bool | false | |
| secondary_axis | bool | false | |
| entity_limit | usize | — | |
| downsample_to | usize | — | |
| opacity | f32 | 1.0 | Overall alpha multiplier (0.0–1.0). Affects line, points, and fill. |
| fill_opacity | f32 | 0.15 | Fill opacity for Area plot type (0.0–1.0). |
| histogram_bins | usize | — | Fixed histogram bin count. None = Sturges' rule. |
Example YAML
plot:
max_history: 5000
view_mode: follow
y_label: "Temperature (C)"
y_label_right: "Pressure (kPa)"
show_legend: true
series:
- source_id: sensor_feed
x_field: timestamp
y_field: temperature
label: "Temp Sensor A"
color: "#4FC3F7FF"
plot_type: Line
show_trend_line: true
- source_id: sensor_feed
x_field: timestamp
y_field: pressure
label: "Chamber Pressure"
color: "#FF8A65FF"
plot_type: Area
secondary_axis: true Questions?
Reach out for help with integration, deployment, or custom domain codecs.