State Transitions panel
The State Transitions panel visualizes changes in discrete values from your topic message paths. Use message path syntax to specify which values to track. Message path functions are supported; see the Series settings for details.
The panel displays data for specified topics across the entire visualization time range.
Current playback time will be indicated by a vertical gray bar.
Paths can point to any primitive value (numbers, booleans, enums, etc.), but will be most useful for enums.
Constants included in your ROS message definition will be displayed as a label for each "enum" plot. Limit enums to one per message definition, as Foxglove will not know which constant name to use in the event of multiple matches.
Settings
General
| field | description |
|---|---|
| Sync with other plots | Sync zooming and panning with other plots |
| Show points | Show a point for each incoming message |
X-axis
| field | description |
|---|---|
| Axis label | Label displayed along the time axis |
| Timestamp format |
|
| Time window |
|
| Window size | For Sliding time window: range of time in seconds |
| Playhead position | For Sliding time window: either at the center or the right edge |
| Min | For Fixed time window: min value in seconds |
| Max | For Fixed time window: max value in seconds |
Series
To reorder series, drag a row to a new position or use the row actions menu.
| field | description |
|---|---|
| Message path | Message path containing values for the series |
| Label | Label displayed in the legend for the series. For dynamic series, this label applies to all sub-series from that path, and each sub-series's label from the data is shown alongside it. |
| Timestamp | Timestamp used for message ordering:
|
| Customize | State customization strategy:
|
Supported message path functions
Dynamic series
You can visualize multiple state series from a single message path using dynamic series. This is useful when your message contains an array of state objects, such as tracking faults or statuses for multiple sensors or subsystems.
To use dynamic series, your message data must contain an array of objects with the following structure:
{
"states": [
{ "label": "sensor_1", "value": "ok" },
{ "label": "sensor_2", "value": "warning" },
{ "label": "sensor_3", "value": "error" }
]
}
Each object requires:
label(string): A user-facing identifier for the sub-series (e.g., 'Sensor ID' or 'Component name'). If the same label appears more than once in the array, only the last occurrence is processed for that sub-series. If a label is missing from a subsequent message, a gap is rendered for that sub-series at that timestamp.value(string, number, or boolean): The state value to display.
Use a slice operator ([:], [2:], [1:5], [4], …) in your message path to enable dynamic series. Use [:] to include the entire array, a range like [1:5] or [2:] to limit the dynamic series to a sub-range, or a single index like [4] to target a single element:
/topic.states[:]
The panel automatically detects this format and creates a separate row for each unique label.
You can also filter dynamic series using message path syntax:
/topic.states[:]{label=="sensor_1"}
Labels and colors
These options are visible when Customize is set to Labels and colors. Use these options to override the colors and labels of existing states in your data. To reorder entries in the list, drag a state to a new position or use the row actions menu.
| field | description |
|---|---|
| Value | When this value matches a state in your data, the overrides below are applied |
| Label | Override for state text label |
| Color | Override for state color |
Continuous value indicators
These options are visible when Customize is set to Continuous value indicators. The section lists all range rules in order of precedence, and also includes a fallback Otherwise state. To change precedence, drag a range rule to a new position or use the row actions menu.
| field | description |
|---|---|
| Comparison | Operator used to determine if the continuous value matches the range |
| Value | Reference value used for comparison |
| Label | Text label to be displayed when a value is in this range |
| Color | Color to be displayed when a value is in this range |
Controls and shortcuts
Pan and zoom
To pan, click and drag using the mouse or trackpad.
To zoom, scroll using the mouse wheel or trackpad. Alternatively, enable the Zoom tool by clicking the button in the toolbar or pressing z on your keyboard:
With the Zoom tool on, click and drag to select an area:
Click the Reset view button in the panel toolbar, press r (when the panel is selected), or double-click the panel to reset to the original viewport, as defined by your panel's range settings:
Scroll vertically
Sometimes not all series fit in the viewport. To scroll vertically, you can:
- Press
Shiftwhile scrolling anywhere in the panel - Scroll over the scrollbar
- Drag the scrollbar
Click-to-seek
Hover over any point on the state transition chart to see state details at the time in a tooltip. You'll see a vertical yellow bar appear, as well as a corresponding yellow marker at the same time on the playback timeline. Click to seek playback to the yellow marker on the timeline.
Only available for recorded data.





