30-30 logo

Docs

Loading a File

Footer + opens Load data.

  • Formats: CSV / TSV / TXT, Excel .xlsx, Parquet.
  • CSV/Excel: layout wizard (header row, optional units row, first data row), then channel select.
  • Parquet: skip layout; channel select only.
  • Paste: Manual entry / paste. First row = headers. Cap 30×10. No drag-and-drop.
  • With data loaded: Add channels from this file (same file only).

Chart Types

Settings → Chart Types:

  • Line/Scatter — line and scatter plots.
  • Time-Series — large time-series datasets.

Chart sidebar Line / Scatter sets the plot style for the active pane.

  • Line: default. Optional Display Points; line-width slider.
  • Scatter: point size/opacity. Requires Line/Scatter in Settings.
  • Grouping locks the plot to line.

View Types

Footer icons switch Chart, Table, and Map. All three share the global row window.

  • Chart: plot + channel sidebar.
  • Table: all columns in the current window. Plotted channels can highlight.
  • Map: lat/lng polyline. Pick channels in the map panel; lat/lng names auto-detect.
  • Map can be hidden in Settings. Invalid coords are dropped (red bands on the slider).

Using Views

Chart sidebar wrench (next to Active Series) opens View Tools. Save/load a .txt JSON view.

  • Stores X/Y/Y2 channels, grouping, and multi-pane layout.
  • Load from View Tools, or during import (channel select).
  • Names missing from the current file are skipped.

Snapshots

Footer camera. Chart view only, with X and at least one Y applied.

  • Captures window, channels, chart settings, grouping, and panes. Thumbnail stored locally.
  • Click a thumbnail in the footer strip to recall.
  • Recall first saves the working view. Close the banner to restore it.

Calculations

Chart sidebar → Calculations. Each formula is a new channel. Source columns are not overwritten.

  • DuckDB expression, one extra column, same rows.
  • Name: letter/underscore, then letters, digits, underscores. Optional unit.
  • Validate shows sample values. Charts plot numbers only.
  • Buttons: Math, Text, Time, Logic, Window. Quote names with spaces: "Air Temp".

Math

Temp * 1.8 + 32
CASE WHEN Temp > 100 THEN Temp ELSE 0 END

Elapsed time

Exports that switch from 59.990 to 1:00.010 are not numeric. Add a seconds channel and plot that as X:

elapsed_seconds(Time)

59.990 = seconds. 1:00.010 = m:ss. 1:00:00.010 = h:mm:ss. Do not cast these to TIME/TIMESTAMP (1:00.010 becomes 1 hour).

CASE
  WHEN Time LIKE '%:%:%' THEN
    try_cast(split_part(Time, ':', 1) AS DOUBLE) * 3600
    + try_cast(split_part(Time, ':', 2) AS DOUBLE) * 60
    + try_cast(split_part(Time, ':', 3) AS DOUBLE)
  WHEN Time LIKE '%:%' THEN
    try_cast(split_part(Time, ':', 1) AS DOUBLE) * 60
    + try_cast(split_part(Time, ':', 2) AS DOUBLE)
  ELSE try_cast(Time AS DOUBLE)
END

Casts and text

try_cast(Time AS DOUBLE)
Time::DOUBLE
col + INTERVAL 1 HOUR
split_part(Name, '_', 1)

Window functions

One value per row. Requires OVER (...). The OVER button inserts OVER (ORDER BY _oid).

val - lag(val) OVER (ORDER BY _oid)
sum(val) OVER (ORDER BY _oid)

sum(val) without OVER is blocked (would collapse rows).

Limits

  • No new tables. No SELECT/FROM/WHERE/JOIN.
  • No comments or multiple statements.
  • Cannot replace a source column — add a new name and plot it.

Grouping

Chart sidebar → Group/Factor. Splits one Y metric into a line per factor level.

  • Needs Line/Scatter and a line plot. Enabling switches to that.
  • Factor column must be categorical (not a numeric measurement).
  • Levels come from the full file, not the zoom window (up to 500 listed).
  • Y2 is cleared. Global slider hides while a grouped slice is active.
  • Disable from the same modal. Channel changes still need Apply.

Home · About · Privacy