Analytics Studio
Visual chart builder for exploring, filtering, and aggregating dataset rows without writing code.
The Analytics Studio is a visual chart builder built into every pipeline-backed dataset. It lets you slice, filter, aggregate, and facet your dataset rows across many chart types, entirely from the UI.
Charts are ephemeral today. They re-render live as you configure them, but are not saved across sessions. Saving, sharing, and exporting are an imminent follow-up and will get their own docs when they ship.
When to use it
Use the Studio when you want to:
- See how a field is distributed across your dataset (e.g. "what does my
sentimentrating look like?"). - Compare a metric across categories, time, or groups (e.g. "win rate by model", "avg latency by day").
- Check slice-by-slice health of a pipeline run (e.g. "per-node completion counts broken out by tag").
- Quickly answer an ad-hoc question without writing SQL.
Opening the Studio
- Open the Data Vault from the left nav and click a dataset to open its detail page.
- Switch to the Studio tab. It takes over the detail page with a left sidebar (chart config) and a main canvas (the rendered chart).
- If the tab is disabled, the dataset is an imported dataset — Studio is pipeline-only right now.
The Studio layout
- Top filter bar — dataset-level metadata filters (Status, Date Range, Node, etc.). Applies to every chart in the tab.
- Left sidebar — two tabs:
- Chart — pick the chart type and configure axes, color, facet, tooltip, style, controls.
- Filters — row-level
Wherefilters and post-aggregationHavingfilters.
- Main canvas — the chart, re-rendering live as you edit the config.
Top filter bar (structural filters)
The top bar is a fixed set of task-level filters that scope every chart in the Studio:
| Filter | Notes |
|---|---|
| Status | Defaults to completed. Change or clear it to include in-progress / failed tasks. |
| Date Range | Filters on task creation / completion time. |
| Node | Limit to one or more pipeline nodes. |
| Attempt Mode | Choose between counting all attempts or only the latest per task. |
| Tags | Filter by task tag(s). |
| Groups | Filter by task group(s). |
| Respondents | Filter by the user/respondent who completed the task. |
Only these seven are promoted to the top bar today. Any row-level predicate on a specific field lives on the Filters tab (see below).
Status defaults to completed. If your dataset has no completed tasks yet, you may see "No data" until you clear or change the Status chip.
Building a chart — step by step
- Open the Chart tab in the left sidebar.
- Pick a Chart category (e.g. Column, Bar, Line & Area). Most categories have one or more subtypes (e.g. grouped / stacked, line / area).
- Pick an X-Axis field. For datetime fields you'll also pick a Time Unit.
- Add one or more Y-Axis measures. Each measure is a
(field, aggregation)pair. Available aggregations depend on the field's type (see Aggregations). - Optionally add Color By (groups / stacks the chart by a categorical field) and Facet (splits the chart into a small-multiples grid).
- Configure Tooltip, Style, and Controls as needed.
- Add row-level Filters or post-aggregation Having filters from the Filters tab.
The chart re-renders on every change — there is no explicit "Apply" button.
Chart categories and subtypes
| Category | Subtypes | What it's good for |
|---|---|---|
| Column | Simple, Grouped, Stacked, 100% Stacked | Comparing a measure across discrete categories. |
| Bar | Simple, Grouped, Stacked, 100% Stacked | Same as column but with long category labels. |
| Line & Area | Line, Multi-line, Area, Stacked Area | Trends over an ordered X-axis (usually time). |
| Histogram | Single field | Shape of a numeric or text-length distribution. |
| Scatter | Single, Colored | Relationship between two numeric fields. |
| Pie | Pie, Donut | Proportional breakdown. Single measure only — see Pie edge cases. |
| Pivot Table | Single | Tabular cross-tab of rows × columns × measure. |
| Box Plot | Single | Distribution summary (quartiles, whiskers) per category. |
| Radar | Single | Multi-axis comparison, one shape per group. |
| Distribution | Single | Density / violin-style distribution per category. |
X-Axis
Choose the field that defines the horizontal position (or the category axis for Bar / Pivot). A few behaviors to know:
- Datetime fields expose a Time Unit (day / week / month / year). For other granularities, use the Time bucket in Controls (see Datetime granularity).
- Numeric fields on Histograms and some other charts use Bin Count from Controls instead of raw values.
- Text / select fields are treated as categorical.
Y-Axis (measures)
Each Y-Axis entry is a (field, aggregation) pair. You can add multiple measures on most chart types (Pie is an exception).
Available aggregations depend on the field type:
| Field type | Aggregations |
|---|---|
| Numeric / Rating | Count, Sum, Mean, Median, Min, Max, Std Dev, Variance, Percentile (P25, P75), Distribution, Mode |
| Boolean | Count, % True, % False |
| Select / Short text | Count, Mode, Distribution |
| Long text / Code input | Count, Avg Length, Avg Word Count |
| Pairwise | Count, Win Rate |
| Ranking | Count, Avg Rank |
| Datetime | Count, Min, Max |
Count is available on every field. If you just want a row count, you can pick Count on any field.
Color By
Pick a categorical field to group / stack the chart by. This turns a single series into multiple series (one per distinct value of the Color By field).
- On Grouped / Stacked / 100% Stacked charts, Color By is what produces the groups.
- On Pivot Table, Color By fills the column axis.
- If Color By is empty on a Pivot Table with two Y-axis measures, the pivot currently falls back to using the 2nd measure as the column axis — an explicit Color By is recommended.
Facet
Facet splits the chart into a grid of small multiples.
- Horizontal — one facet per distinct value across columns.
- Vertical — one facet per distinct value down rows.
- You can set only Horizontal, only Vertical, or both (producing a 2-D grid).
- When only Horizontal is set, a Wrap columns control controls how many panels per row before wrapping.
Known limitation. The facet field picker currently only lists select fields. The backend supports any field as a facet, but the UI restriction hasn't been relaxed yet.
Tooltip
By default, hovering a chart element shows:
- The X-axis value (or category).
- Each Y-axis measure's value.
- The Color By group (if set).
A richer tooltip (e.g. pinning additional dataset fields to the tooltip) is planned; the placeholder "Phase 2" text has been removed while we finalize the design.
Style
Style has a few visual polish options:
- Show legend — toggle the legend on/off.
- Show grid — toggle gridlines.
- Show value labels — label each mark with its value.
- Axis labels — override auto-generated axis titles.
Chart colors are auto-assigned from a fixed palette today. There is no UI for per-series color editing.
Controls
Controls refine how the chart aggregates and orders data.
Sort
Order the categories on the X-axis (or category axis). Options:
- Value (descending / ascending) — by the Y-axis aggregated value.
- Label (A–Z / Z–A) — by the X-axis label.
- Frequency — by raw underlying row count.
Multi-measure caveat. On charts with multiple Y-axis measures, Frequency currently sorts by the first measure. Prefer Value with an explicit primary measure if you care about ordering.
Top-N
Keep only the top N categories by the Y-axis value. Pair it with:
- Group others as "Other" — bucket everything outside the top N into a single
Othercategory. Only takes effect on grouped / multi-series charts (grouped or stacked column/bar, multi-line, stacked area, pie, pivot). On non-grouped charts the toggle is a no-op today.
Null handling
Choose how to treat null / empty values in the X-axis or grouping field:
- Exclude — drop rows with a null value in that field.
- Include as empty — keep them under a dedicated "(empty)" bucket.
- Replace with — relabel nulls with a custom string (e.g. "Unknown").
Datetime granularity
For datetime X-axes, you can control granularity in two overlapping places today:
- X-Axis → Time Unit — day, week, month, year.
- Controls → Time bucket — Auto, day, week, month, quarter, year.
Use whichever you prefer. They drive the same underlying bucketing. Note: Quarter is currently only available in Controls → Time bucket, not in X-Axis → Time Unit.
Histogram Measure
For text-field histograms, pick what the histogram counts over: character length, word count, or value frequency.
Bin Count
For numeric histograms, set how many bins to split the range into. Defaults to auto.
Normalize
For Radar charts, normalize axes so each measure is on a common 0–1 scale — useful when measures have very different units or ranges.
Comparison
A per-series post-aggregation transform applied to the Y-axis. Options:
- % of Total — each bar / point as a percentage of the series total.
- Cumulative Sum — running total left-to-right along the X-axis.
- Running Average — rolling mean along the X-axis.
"Comparison" here refers to this single-series transform. A separate two-segment statistical comparison (t-test / effect size / significance) is a distinct future feature.
Filters
The Filters tab has two independent sections.
Where filters (row-level)
Applied to dataset rows before aggregation. Each filter is (field, operator, value).
Multiple Where filters combine with AND.
Supported operators
| Category | Operators |
|---|---|
| Equality | equals, not equals |
| Comparison | greater than, greater than or equal (≥), less than, less than or equal (≤) |
| Text | contains, not contains, starts with, ends with, matches regex |
| Set | in, not in |
| Existence | is empty, is not empty |
| Range | between |
Which operators show up in the operator dropdown depends on the selected field's type — e.g. starts with only appears for text fields, between only for numeric / datetime.
Having filters (post-aggregation)
Applied after aggregation, on the aggregated value. Each filter is (field, aggregation, operator, value).
Use these to answer questions like "show only categories where Mean rating ≥ 4" or "hide groups with Count < 10".
Verifying a chart
A few quick ways to sanity-check a chart:
- Toggle the top-bar Status chip. If your numbers look unexpectedly low, you may still be scoped to
completedonly. - Open the Data Table view of the same dataset with the same Where filters applied manually — row counts should match the chart's underlying query.
- Switch to Pivot Table temporarily — it shows the raw aggregated numbers in a grid and is the easiest way to see what's actually being counted.
- Add a Count measure alongside your primary measure to see how many rows are in each bucket. Low counts often explain weird means / medians.
Common mistakes
- Default Status filter hides your data. The top bar defaults to
Status = completed. If your pipeline tasks aren't completed yet you'll see an empty chart. - Expecting charts to save. They don't yet — refreshing the page resets the config.
- Picking an aggregation the field doesn't support. The dropdown is already filtered by field type, but if you duplicate a measure and change the field, double-check the aggregation is still valid.
- Using Color By on a very high-cardinality field. You'll get hundreds of series and a legend explosion. Pair Color By with Top-N + "Group others as 'Other'".
- Expecting "Group others as 'Other'" everywhere. It only applies to grouped / multi-series charts today.
- Trying to facet on a non-select field. Facet currently only lists
selectfields.
Limitations
- Studio is only available on pipeline-backed datasets. Imported datasets don't have the Studio tab yet.
- Charts are ephemeral — not saved, not shareable, not exportable yet.
- Color customization is auto-only; no per-series palette editor today.
- Facet is limited to
selectfields. - "Group others as 'Other'" applies only to grouped / multi-series charts.
- Frequency sort with multiple Y-axis measures currently sorts by the first measure.
- Pie chart coerces multiple Y-axis measures down to the first.
A worked example
Say you want to answer: "For completed tasks in the last 30 days, how does average rating on the feedback field vary by model, broken out by question_type?"
- Open the dataset → Studio tab.
- Top filter bar:
- Status =
completed(default). - Date Range =
Last 30 days.
- Status =
- Chart tab:
- Chart category = Column, subtype = Grouped.
- X-Axis =
model. - Y-Axis =
feedback, aggregation = Mean. - Color By =
question_type. - Facet → Horizontal = (optional, e.g.
tag) if you want a small-multiples view.
- Controls:
- Sort = Value (desc).
- Top-N =
10, Group others as "Other" = on. - Null handling = Exclude.
- Filters tab:
- Where:
feedback ≥ 1to drop placeholder zeros. - Having:
Count ≥ 5to hide low-volume groups.
- Where:
You now have a grouped column chart comparing average feedback per model, grouped by question type, with low-volume and noisy rows filtered out.