Docs/Infohub (Flow)/How Infohub Charts Work
Infohub (Flow)Concept

How Infohub Charts Work

Charts are trees the chart type builds for you — drop a measure on the right node and the structure appears.

Updated 15 Oct 2026Infohub Docs

Infohub charts behave differently from charts in most reporting tools, and understanding the difference saves a great deal of confusion. A chart is not a canvas you place things on. It is a tree that the chart type constructs, and your job is mostly to drop measures onto the right node and set properties.

The three layers#

Layer What it is Examples
Chart The root — one chart type, one interval A Time Based Chart, a Widget
Chart component A structural node Axes, panes, sections, titles, periods
Chart item A configuration leaf under a component A series, a limit, a colour, a label

A chart of any complexity is a few dozen of these arranged in a hierarchy. You rarely build that hierarchy yourself.

The chart type builds the structure#

This is the key idea. Create a Widget chart and it starts out with components and no content:

comp 1  General
comp 2    Properties
comp 3    Title
comp 4    Period
comp 5    QuickLinks
comp 6  Sections          < drop here

Drop a measure on Sections and the chart type materialises everything below it:

comp 6  Sections
comp 7    Section
comp 8      Widget
item 1        MeasureItem [Measure = Quality Rate]
item 2          MeasureLimitItem
item 3          MeasureEventAttributeItem
item 4          ColorItem

The Section, the Widget, the MeasureItem and its three child items did not exist a moment earlier. They are a result of the drop.

Tip

There is no "add a measure to a section" step. This is the question everyone asks first. You do not create a Section and then put a measure in it — you drop the measure on the container and the Section is created for you. Working with the chart type rather than against it is the whole technique.

Which node accepts a drop varies by chart type. In Flow Config, the designer shows you where a measure can go. From the CLI, you ask:

--list-chart-node-options --chart-id 1 --measure-id 33

which prints every node that will accept that measure, along with the command to use.

Constructors fix the interval#

A chart is created through a named constructor, and for most time-based chart types there is one constructor per interval — Tag, Minutely, Hourly, Shiftly, Daily, Weekly, Monthly, Quarterly, Yearly.

The constructor sets the chart's interval permanently, and the chart then accepts only measures at that same interval.

Important

Interval mismatch is the most common chart problem. A measure that will not drop onto a chart is nearly always at the wrong interval. And a Tag interval measure has no interval at all, so every interval chart refuses it — chart the hourly or daily derivation instead.

If you need the same quantity on an hourly and a daily chart, that is two charts, or two measures. The interval is not something you change on an existing chart.

Where a factory has only one constructor, you can omit the choice. If you supply a name the factory does not recognise, the error lists the valid ones.

Properties#

Almost everything visual is a property on a component or an item: axis minimum and maximum, series type, interpolation, colour, label format, whether a legend shows.

Properties are strongly typed and validated when set. A property that does not exist on that node, or a value that cannot be converted to the right type, is rejected rather than quietly ignored — which is helpful, because a silently discarded property setting is very hard to notice.

Where a measure has a format string and a unit, the chart uses them. Set those on the measure rather than overriding them per chart, and every chart displaying that measure agrees. See Format Strings.

Metrics and event schemes drop too#

Measures are not the only thing you can drop.

  • A metric produces the chart type's structure for a whole metric, which is a fast way to build a chart of a related family of measures.
  • An event scheme produces an event-scheme component with its attribute items, which is how event tables and timelines get their content.

The same "ask which node accepts it" approach applies.

Limits come from the measure#

A limit shown on a chart is not configured on the chart. It is configured on the measure, and then bound onto the chart.

There is a rule that follows from the structure: a limit slot only accepts a limit belonging to the measure on its parent chart item. So the chart must already carry that measure as a series before its limit can be bound.

The practical sequence is therefore: add the measure to the chart, then bind its limit. Attempting the reverse has nowhere to attach. See Measure Limits and Thresholds.

Editing a released chart changes its version#

If a chart has been released as a template, any edit un-releases it and increments its version.

This is deliberate — a released template should be a fixed thing, so modifying it means you are producing a new revision rather than silently changing what other charts derived from. It does mean that opening a released chart and adjusting an axis leaves it unreleased, and you must release it again for instances to be able to take the change.

See Chart Templates and Releases.

Chart type IDs are per-instance#

The identifier for a chart type is a database row, and the values differ between instances.

Never hard-code them in a script. Look them up:

--list-chart-types

This is one of the most common causes of a model build script that works on one instance and creates the wrong kind of chart on another.

Building charts from the CLI#

The whole chart surface is scriptable, which matters for large or repeated dashboard sets:

# what types exist here?
--list-chart-types

# create a chart at a specific interval
--create-chart --name "Steam Flow" --chart-type-id <id> \
    --chart-constructor Daily --report-folder-id <id>

# where can this measure go?
--list-chart-node-options --chart-id <id> --measure-id <id>

# put it there
--add-chart-measure --chart-component-id <id> --measure-id <id>

# inspect the result
--list-chart-tree --chart-id <id>

--list-chart-tree is the one to lean on. Because the structure is built for you, seeing what was actually created is how you confirm a scripted chart is right. See Authoring Charts from the CLI.

Diagnosing#

Symptom Cause
Measure will not drop on a chart Interval mismatch, or a Tag-interval measure on an interval chart
No node accepts the measure Wrong chart type for what you are trying to show
Chart created but empty The measure was never dropped, only the chart created
Limit will not bind The chart does not carry that measure as a series yet
Property rejected Property does not exist on that node, or the value is the wrong type
Script creates the wrong chart type Hard-coded chart type ID — look it up instead
A released chart is suddenly unreleased It was edited; releasing bumps the version
Chart renders differently from the measure's other charts Format or unit overridden on the chart instead of set on the measure
esc
↑↓ navigate · ↵ open · ⌘K anywhere