Figure is the flowss studio for journal-ready research figures. You bring a dataset in, draw panels from it, compose them at your journal's real column width in millimetres, and export files that already meet that journal's published artwork rules. Every value in a generated panel comes from your rows; nothing is retyped by a model. A compliance check reads the composed artwork the whole time you work (width, height, type size, image resolution, vector format, colour mode and colour-vision safety), and an export gate stops a figure that breaks a blocking rule from leaving until you repair it or record that you read the finding. One project holds a whole manuscript of figures, each with its own data, cleaning ledger and analyses, and a single click writes them all, with a preflight report, into one ZIP. You open Figure at /figure.
This page covers the workspace, bringing data in, drawing and composing panels, the journal check and every export. The cleaning, transform, statistics and study-design benches have their own page: Figure analysis and statistics.
At a glance
| Topic | What you need to know |
|---|---|
| Where | /figure. The browser tab reads flowss — Figure — journal-ready research figures from your dataset |
| Plan | Starter and above. A Free account is sent to the pricing page. See Plans and what they include |
| Input | Paste or upload CSV, TSV or JSON; load one of 5 sample datasets or 13 figure starters; paste or upload an SVG; upload a PNG, JPEG, GIF or WebP image; or receive rows from the Studio, the Lab or the Library |
| Panels | 36 chart types to build by hand, plus recommended charts for your columns, statistical result panels, a shared colour key, pasted SVG and embedded images |
| Journals | Nature, Science (AAAS), Cell Press, PNAS, Elsevier (generic journal), IEEE, PLOS, Springer, and Generic (no journal selected) |
| Checking | Continuous and deterministic. Errors block export; warnings advise. Many findings carry a one-click repair |
| Export | SVG; PNG and TIFF at the target dpi; PDF at printed size; a manuscript ZIP of every figure plus preflight.txt; a reproducibility bundle; the data as CSV; and LaTeX, subfigure, Markdown, caption and Methods text to copy |
| Manuscript | Up to 12 figures in one project, switched from the title |
| AI | The prompt at the bottom opens the flowss Figure Agent, the studio's figure analyst: a deterministic Advisor that needs no AI, and an AI chat with the agent that needs your own key (Starter) or hosted AI points (Plus and up). See AI in flowss |
| Collaboration | Figure has no live sessions, comments or share link. Hand work on with exports, Send to or Study this figure |
| Saving | Autosaves in this browser, syncs to your other devices with your workspace, and can be checkpointed to the Vault. Each figure that holds work is also a card in the Library |
On Windows and Linux, read ⌘ as Ctrl, ⌥ as Alt and ⇧ as Shift throughout this page.
Opening Figure
- Sign in. Figure needs a signed-in account; a signed-out visit goes to sign-in and returns you to the same address afterwards.
- Go to /figure, or choose Figure from the workstation navigation.
- If your plan is Free, you are redirected to /pricing. Starter, Plus, Ultra and Enterprise all open Figure.
A short loading skeleton shows while the studio starts. A first visit lands on the canvas with nothing open and the Bring data in card in the middle. After that, Figure remembers which centre view you had up (Data table or Figure) and which face of the analyst you last used (Advisor or AI chat). It always reopens with the benches and the analyst put away, so a reload lands on a clear canvas. On a screen narrower than 1,024 pixels everything opens closed regardless.
The workspace
The canvas is the page. Everything else floats on it in fixed places and puts itself away when you are done with it.
| Place | What is there |
|---|---|
| Top left (identity island) | The figure's name (click it to rename; a figure with no name shows as Figure 1, Figure 2 and so on, by position), the ▾ figure switcher, the status badge and the ⋮ file menu |
| Top right | Export, the one filled button on the screen. It opens the Export bench as a popover |
| Left edge (tool rail) | Select (V), Hand — drag to pan (H), Data, Analyse, Chart, Annotate, Layers |
| Bottom centre | The prompt, Ask the flowss Figure Agent…, with the AI settings button |
| Bottom right (view island) | Undo, Redo, the Data table / Figure toggle, and, on the Figure view once there is a panel, zoom out, the zoom percentage menu and zoom in; then Help |
| Right edge | The Inspector drawer with three tabs: Style, Source and Page. It can be pinned open |
| Above a selected panel | The panel's context toolbar, shown only while a panel is selected on the Figure view |
| Bottom centre, over the canvas | The amber marker Example data — not real: this sheet holds a sample dataset, while the figure's rows are a sample |
The Help button opens Keyboard shortcuts and Help centre.
The empty canvas
| State | The card in the middle shows |
|---|---|
| No data yet | Bring data in ("Paste CSV, TSV or JSON — every panel is drawn from it."), a paste box, Analyse data, Upload a file, the list Or start from a figure, and the links Load a sample (loads the first sample dataset, Clinical trial — blood pressure) and Paste SVG |
| Data but no panels | Add the first panel, your rows read back on one line ("20 rows · 5 columns: patient, arm, …"), the buttons Draw a chart and Run a test, and the links Open the table and Paste SVG |
The card steps aside while a rail flyout is open, because the flyout is the same door.
The tool rail and its benches
The five tool buttons each open a bench as a flyout beside the rail. Pressing the same button again closes it. A flyout with several tabs remembers the tab you were last on for the rest of the session.
| Rail button | Flyout tabs | What the benches do |
|---|---|---|
| Data | Data in, Clean, Transform | Paste, upload or sample a dataset; findings in the rows with one-click cleaning; filter, aggregate, derive and reshape the table. A warning badge counts the findings in the rows |
| Analyse | Tests, Design | Run a statistical test and add the result as a panel; sample size, power, detectable effect and equivalence margins before there are rows |
| Chart | Charts | Recommended charts for your columns and the manual chart builder. Disabled until there is data, with the reason "Bring data in first" |
| Annotate | Annotate | Text, arrows, brackets, significance marks and scale bars drawn over the panels |
| Layers | Panels | Every panel on the figure: caption, span, geometry, source, style and data refresh. A badge counts the panels |
Three benches are not on the rail because they are not tools: Compose is the Inspector's Page tab, Check is the status badge's popover, and Export is the Export button. All eleven benches can be reached by name from ⌘K (for example, type "Clean" or "Check").
The analysis benches (Clean, Transform, Tests and Design) are documented in Figure analysis and statistics.
The ⋮ file menu
The verbs in this menu are also ⌘K commands, so the menu and the palette always agree. The exceptions are Data (CSV), the studio rows under Send to ▸, and the three lists (Load a sample ▸, Start from a figure ▸ and Journal ▸), which live in the menu only.
| Row | What it does |
|---|---|
| New figure | A fresh figure in this manuscript, placed after the current one and seeded with the dataset on the bench |
| Duplicate figure | A copy of this figure, its data and its bench, as a new figure named after the original with " copy" added |
| Load a sample ▸ | One of the five sample datasets |
| Start from a figure ▸ | One of the 13 figure starters, which opens as a finished figure |
| Import ▸ | Import data file… (CSV, TSV or JSON), Import SVG file…, Paste SVG… (opens the Data bench with its SVG box focused), Import image… |
| Export ▸ | Export SVG, Export PNG, Export TIFF, Export PDF, Export every figure, Export repro bundle, Data (CSV). Data (CSV) is disabled with "No rows yet" until there is data |
| Send to ▸ | Study this figure, then Studio, Weave, Lab, BPMN, Science and Evidence. The studio rows are disabled with "Add a panel first — there is nothing composed to send" while the figure is empty |
| Page setup… | Opens the Inspector on its Page tab |
| Journal ▸ | Pick the journal preset. The row shows the current journal's short name (for example "Science"), and nothing while Generic is selected |
| Delete figure… | Removes this figure from the manuscript after a confirmation. Its panels, data and bench go with it |
⌘K also offers Run compliance check (opens the Check report), Generate figure legend, Undo and Redo, and "go to" rows for every screen: the two views, the eleven benches and the analyst's two faces.
On a phone, the status report, the view toggle (Show the figure or Show the data table) and the zoom menu move into the ⋮.
The status badge
The badge beside the title is the figure's one verdict.
| The badge shows | When |
|---|---|
| A count of errors and warnings | The figure has panels and the journal check found something. The number is the Check report's |
| A readiness word: Empty, Draft, Sound, Reviewed or Publishable | There is nothing to count, or the figure has no panels yet |
| Not saved | This browser's storage refused the last save. The detail reads "Storage is full — export to keep this work" |
Clicking the badge opens the Check report, titled Check · followed by the journal's name (see Checking against the journal). The platform's stage chip also sits inside it; choosing a stage there hands the work to the flowss Figure Agent's AI chat. See The work model.
A manuscript of figures
A Figure project is a manuscript: up to 12 figures that you switch between from the title. Each figure keeps its own dataset, its own data ledger and its own analyses, so the Methods paragraph for Figure 2 describes Figure 2's rows and nothing else.
| Action | How |
|---|---|
| Switch figure | Click the title's ▾ and choose a figure, or press ⌥⌘← / ⌥⌘→ to step through them (the step wraps from last to first) |
| New figure | New figure at the foot of the switcher, ⋮ → New figure, or ⌘K. The new figure inherits the dataset on the bench and the ledger that prepared it, but not the analyses |
| Duplicate | The copy icon on a figure's row, ⋮ → Duplicate figure, or ⌘K. The copy carries the composition, the data and the whole bench. Duplicating another figure's row opens that figure first, then copies it |
| Rename | Click the title, or the pencil on the open figure's row. Names are kept to 120 characters |
| Reorder | Drag a row in the switcher, or focus a row and press ⌥↑ / ⌥↓. Reordering is off while the search box is filtering |
| Delete | The bin icon on a row (shown only while the project has more than one figure), or ⋮ → Delete figure…. Both ask you to confirm ("Delete" the figure's name "? This cannot be undone.") |
| Find a figure | A Find a figure search box appears at the top of the switcher once a project holds more than seven figures |
Each row in the switcher carries a small database marker. Hover it to read the panel count and one of: "the dataset on screen", "carries its own dataset, different from the one on screen" (the marker turns amber, so you know choosing it will swap the table), or "no data of its own".
Note: A manuscript always keeps at least one figure. ⋮ → Delete figure… on the last one says "A manuscript keeps at least one figure — add another before deleting this one."
Warning: Work that finishes after you switch figure is never applied to the wrong one. If a chart, a fit, a restyle, a re-render, a refresh, a legend or an AI run lands after you moved, it is dropped and a toast names the figure it was for, for example: That chart was for "Figure 1", not the figure now on screen — it was not applied. Switch back to it and try again.
Your first figure, step by step
- Open /figure. The canvas shows Bring data in.
- Paste CSV, TSV or JSON into the box and press Analyse data, or press Upload a file, or press the Load a sample link. To see a finished figure first, pick one from Or start from a figure (volcano, Kaplan–Meier, forest plot and others).
- The card now reads your rows back (for example "20 rows · 5 columns: patient, arm, …") and offers Draw a chart and Run a test. Press Draw a chart.
- On the Charts bench, press one of the Recommended charts, or choose a Chart type under Build by hand, pick the columns for each role and press Generate panel. The panel appears on the canvas at its printed size.
- Add more panels the same way. Open Layers to caption them and set how many grid columns each spans.
- Press the title's ⋮ → Journal ▸ and choose your journal. The figure snaps to that journal's column width and line-art dpi, and the panel letters follow its convention where one is known.
- Open Page setup… to set the column fit, the title and the caption. Generate legend writes a caption from the title and panel captions.
- Watch the status badge. If it shows a count, click it to open the Check report and press the repair buttons, or fix the finding by hand.
- Press Export. Choose the format, or the All N figures + preflight (ZIP) button for the whole manuscript.
Bringing data in
Paste or upload
The Data in tab (rail Data) is the full intake; the canvas card is a quick version of it.
| Control | What it does |
|---|---|
| The paste box ("Paste CSV, TSV or JSON") | Holds the text you paste. Its tooltip reminds you that every value in a generated panel comes from these rows |
| Analyse data | Parses the box and puts the rows on the bench. Disabled until there is text (tooltip "Paste some rows first") |
| Upload file (Upload a file on the canvas card, ⋮ → Import data file…) | Reads a .csv, .tsv or .json file. Choosing the same file again re-reads it |
| Or load a sample | A list with two groups, Datasets and Figure starters — open as a finished figure (each starter is marked "(illustrative)") |
| The rows line | The row count and each column with its type, for example "20 rows · patient (string), arm (string), …", once data is on the bench |
What the parser accepts:
| Input | Notes |
|---|---|
| CSV, TSV, semicolon- or pipe-separated text | The first line must be a header. The delimiter is detected; if splitting on the guessed one leaves the rows uneven, or every comma sits between two digits (a decimal comma), the file is re-read with the right delimiter and a note says so |
| JSON | An array of row objects, or an object holding one under data, rows, values or records |
| Decimal commas | A column that writes "0,5" is read as 0.5 and a note names the column and an example |
| Missing-value codes | NA, N/A, NaN, null, #N/A, #NA, <NA>, ., -, – and — (in any letter case) in an otherwise numeric column become blanks, and a note says how many, where. None and ? are deliberately not read as missing |
| Short rows | A row with fewer values than the header has its missing cells read as blanks, and a note names the rows |
| Limits | 200,000 rows and 256 columns |
Notes appear in amber above the rows line. They are not errors: the data loaded, and the note tells you how it was read.
Warning: Pressing Analyse data or uploading a new file replaces the rows and starts a fresh provenance chain: the data ledger, the analyses on the bench and any declared experimental unit are cleared, and undo history for the table starts again. If you had edited the table, a note says "Reloaded from the pasted text — earlier table edits, the ledger and past analyses were reset."
Sample datasets and figure starters
Samples are for learning the studio. The five datasets are:
| Sample | Field |
|---|---|
| Clinical trial — blood pressure | Medicine |
| Materials stress test — steel specimens | Engineering |
| Monthly revenue by region | Business |
| Flower morphology (illustrative) — three species | Biology |
| Support survey — satisfaction by channel | Social science |
Loading a sample also sets the analyst's research discipline to the sample's field, if the discipline is still General research.
The 13 figure starters are the classic research figures, each a small invented dataset that opens as its finished figure through the same chart builder you use by hand, drawn across the full width of the grid. Replace the rows with your own (with Refresh data on the panel) and the same figure is drawn from them.
| Starter | What it opens as |
|---|---|
| Grouped bar chart with error bars | Invented ELISA results, mean ± SEM of four biological replicates |
| Box and violin plot with jittered points (raincloud) | Invented reaction times for 72 participants in three sleep conditions |
| Scatter plot with regression line and 95% CI | Invented air and water temperatures at 30 sites; the line and band are fitted and recorded by the Analyse bench |
| Dose–response curve (4PL, IC50) | Two invented compounds over nine concentrations in triplicate; a four-parameter logistic is fitted to each with 95% bands |
| Kaplan–Meier survival curve | Invented overall survival for 80 patients in two arms, with censor ticks, bands, medians and numbers at risk |
| Volcano plot | Invented RNA-seq results for 293 genes, with 2-fold and adjusted-p < 0.05 cut-offs |
| Clustered heatmap | Invented expression z-scores for 16 genes, reordered by hierarchical clustering |
| Time series with confidence band | Invented weekly influenza incidence with exact Poisson intervals |
| Before–after paired plot | Invented FEV1 for 18 patients before and after treatment, one line per patient |
| Forest plot (meta-analysis) | Ten invented trials; the pooled random-effects diamond, I², τ² and prediction interval are computed when the plot draws |
| Histogram with density curve | Invented, right-skewed vitamin D values for 160 adults |
| PCA biplot | Invented soil analyses from 24 sites, scores and loadings on two components |
| ROC curve | Invented troponin results for 120 patients with AUC, DeLong interval and Youden cut-off |
The example-data marker
While a figure's rows are a sample (Figure recognises a sample when at least half your rows match one), the studio says so everywhere it matters until you replace them with your own:
| Where | What it says |
|---|---|
| The canvas | The amber pill Example data — not real: this sheet holds a sample dataset |
| The Data in tab | Example data — not real. These rows are a sample that ships with the studio. The Methods text, preflight report and every export say so until you analyse or upload your own data |
| Every exported SVG, PNG, TIFF and PDF, and the whole figure sent to another studio | A stamp inside the figure's box |
| The Methods paragraph | Opens with: Example data — not real: these values are an example that ships with the platform, not data from a study. |
preflight.txt and the bundle README | Open with the same warning |
Cleaning a sample does not clear the mark; replacing the rows does. A new figure made from a sample's rows keeps the mark too.
Large datasets
Figure saves each figure's rows in this browser. Rows whose saved form would exceed 750,000 characters are kept for the session but not saved: the note "This dataset is too large to persist locally — it stays for this session and still exports." appears, the rows survive switching between figures, and every export still includes them. Reloading the page loses them, so keep the source file. A new figure cannot inherit rows this large: you are told "This dataset is too large to persist locally, so it did not travel to the new figure — paste or upload it here." A duplicate does carry them.
Rows from other studios
Several places hand rows to Figure, which opens them as a new figure titled after the data (or "Imported data") beside whatever you have open, with the toast "Your data opened as a new figure sheet":
| From | Control |
|---|---|
| The Studio's data panel and intake | Open in Figure studio — rows become a sheet |
| The Lab's Data bench | Open these rows in Figure |
| The Library's file import and the launchpad's start-with-data door | A data file you import there goes to Figure |
The hand-off holds up to about 600 KB of text. If it cannot be staged the sending studio says "Couldn't stage the data (too large or storage unavailable)." If your project already holds 12 figures, the imported rows wait: the message says to remove a figure and reload the page, and they open then. See Moving work between studios.
SVG panels
Any SVG you already have can be a panel. Use the From an SVG you already have box on the Data in tab (or ⋮ → Paste SVG…), paste the markup and press Add as panel (disabled until the box has text), or press Upload .svg (or ⋮ → Import SVG file…).
Every SVG is cleaned on the way in: scripts and anything that can run or fetch are removed, and only references inside the document (#…) and embedded data:image/… pictures survive. If the SVG pointed at an external image or a linked file, the panel still arrives, with a note naming what was removed and that the panel "will export blank where it drew". Re-export the SVG with its images embedded as base64 data URIs and add it again.
A pasted SVG panel has no engine source, so it cannot be restyled, re-rendered from source or refreshed from new data, and it wears a grey untraced chip on the canvas.
Images: micrographs, blots and photographs
Under A micrograph, blot or photograph, press Upload image (or ⋮ → Import image…). The picture is embedded in the figure at its own pixel size, so the figure stays one self-contained file and the Check report can hold it to the journal's halftone dpi across the millimetres it occupies.
| Rule | Detail |
|---|---|
| Accepted | PNG, JPEG, GIF and WebP |
| Refused | TIFF, HEIC/HEIF, Photoshop documents and camera raw files, because no browser draws them inside a figure. Convert to PNG (lossless, right for a blot or a micrograph) or JPEG first. The Export bench writes TIFF for you on the way out |
| Size | Up to 12 MB per image. Larger files are refused with a message to downsample to about the pixel width the journal needs |
| Unreadable header | A file whose pixel dimensions cannot be read is refused with a request to re-save it as a plain PNG or JPEG |
The image panel's caption starts as the file name without its extension, and its source line records the file name, pixel size and type. An image panel cannot be restyled or refreshed.
The Data table view
Switch the centre of the screen between Data table and Figure with the toggle in the view island (or ⌘K → "Data table"). The table is a card over the canvas holding every row, editable. With no data, the canvas shows the Bring data in card instead.
| Control | What it does |
|---|---|
| Row | Adds an empty row |
| Column | Asks for a column name; Add creates it (Escape cancels) |
| Find & replace | Opens find, replace with and Replace in text columns |
| Row checkboxes, then Delete N rows | Deletes the selected rows. Selection clears whenever the table changes |
| The copy icon at a row's end (on hover, "Duplicate row") | Duplicates that row |
| A column's name | Sorts by it, ascending |
| The type badge | 123 (number), abc (text), date, t/f (true/false) |
| "N blank" under a header | How many cells in the column are empty |
| ⋯ on a header ("Column tools for" the column's name) | Sort ascending, Sort descending, Rename… (type the new name and press Ok), Coerce to number, Coerce to text, Coerce to date and Coerce to boolean (the column's own type is left out), Fill blanks with the mean (numeric columns with blanks), Fill blanks with previous value (columns with blanks), Trim whitespace, Delete column |
| Any cell | Click or tab into it to edit. Enter commits, Escape cancels. An empty cell shows ∅. Typing a number into a numeric column stays a number; anything unparseable stays text and the column's badge says so |
| The pager | Shown when there are more than 100 rows: 100 rows a page, "Rows 1–100 of N" |
The table's own counter reads "N rows · M columns". An empty table says "No rows — add one, or paste new data." If an operation is refused (renaming onto an existing name, deleting the last column, a coercion whose reading is ambiguous), the reason appears in a red strip above the table. Every edit is undoable and recorded in the data ledger. While the table is showing, ⌘Z and the view island's Undo undo data changes; while the figure is showing, they undo composition changes.
Drawing panels: the Charts bench
Open the rail's Chart button.
Recommended charts
Under Recommended, up to six charts are proposed for your columns, each with its engine and a one-line reason. Press one to draw it.
Build by hand
Under Build by hand, choose a Chart type (the picker names each with its engine in brackets), pick a column for each role (roles marked "(optional)" can stay empty), set any options the type has, and press Generate panel. Below the picker, a line describes the chosen type. Options left blank use the default shown in the table.
| Chart type (engine) | Roles | Options |
|---|---|---|
| Bar chart (vega-lite) | Category (x), Value (y). Repeats are averaged, or summed when the quantity adds up | Bar order; Value axis |
| Bar chart with error bars (vega-lite) | Group (x), Mean (y), Spread, Series (optional). Needs one row per group | The spread is: as its column is named (default), Standard deviation, Standard error, CI half-width or A stated range; Bar order; Value axis |
| Grouped bar chart (vega-lite) | Group (x), Value (y), Bars within a group | Bar order; Value axis |
| Stacked bar chart (vega-lite) | Category (x), Value (y), Stack by | Stack as: Raw totals (default) or Shares of 100%; Bar order |
| Small multiples (facets) (vega-lite) | X axis, Y axis, One panel per, Colour by (optional) | Draw each as: Points (default), Lines or Bars; Y axis and X axis scale |
| Violin plot (vega-lite) | Group (x), Value (y) | |
| Raincloud plot (violin + box + points) (glyphscript) | Value, Group (optional) | |
| Dual-axis line chart (vega-lite) | X axis, Left axis, Right axis. The second series is dashed | X axis scale |
| Line chart (vega-lite) | X axis, Value (y), Series (optional) | Value axis |
| Line with confidence band (vega-lite) | X axis, Estimate (line), Band lower end, Band upper end, Series (optional) | The band is: an interval (unstated) (default), 95% confidence interval, 90% confidence interval, 95% prediction interval, 80% prediction interval, Mean ± 1 SD or Observed range |
| Scatter plot (vega-lite) | X axis, Y axis, Colour by (optional) | Y axis and X axis scale |
| Dose–response plot (vega-lite) | Dose (concentration), Response, Curve per (optional) | Dose axis: Logarithmic (default; controls at 0 are noted, not drawn) or Linear (draws controls at 0, or a column already in log dose); Response axis scale |
| Volcano plot (vega-lite) | log₂ fold change, P value (raw or adjusted), Feature name (optional) | Fold-change cut-off: 2-fold (default), 1.5-fold or 4-fold; Significance cut-off: p < 0.05 (default), p < 0.01 or p < 0.001 |
| PCA biplot (vega-lite) | First component (x), Second component (y), Row name, Score or loading, Colour scores by (optional) | |
| Histogram (vega-lite) | Value | Density curve: none (counts) (default), or Kernel density, bars as density |
| Box plot (vega-lite) | Group (x), Value (y) | Value axis |
| Before–after (paired) plot (vega-lite) | Subject, First occasion (before), Second occasion (after) | |
| Heatmap (vega-lite) | X axis, Y axis, Value | Row and column order: alphabetical (default), As the rows are, or Hierarchical clustering (average linkage); Colour scale: sequential (default) or Diverging about 0 (z-scores, fold changes) |
| Pie chart (vega-lite) | Category, Value. Best under seven categories | |
| Matrix heatmap (plotly) | Row label. Every numeric column becomes a column of the matrix | |
| Sankey flow (sankey) | Source, Target, Weight | |
| Directed graph (graphviz) | Source, Target, Weight (optional) | |
| Tree diagram (graphviz) | Child, Parent | |
| Treemap (treemap) | Item, Parent, Size (optional) | |
| Funnel (funnel) | Stage, Count | |
| Choropleth map (choropleth) | Region code, Value | Atlas: World (ISO codes) (default) or US states |
| Timeline (timeline) | When, Event | |
| Calendar heatmap (calendarheatmap) | Date, Value | |
| Word cloud (wordcloud) | Term, Weight | |
| Kanban board (kanban) | Status, Card | |
| PERT chart (pert) | Task, Duration, Depends on (optional) | |
| Kaplan–Meier survival curve (glyphscript) | Follow-up time, Event (1) or censored (0), Arm (optional) | Time axis is in: Days, Weeks, Months or Years |
| ROC curve (glyphscript) | Score, Outcome (0/1), Second score (optional). A second score adds DeLong's paired comparison | The score came from (see below) |
| Calibration plot (glyphscript) | Predicted risk (0–1), Outcome (0/1) | Risk groups: 5 (quintiles), 10 (deciles) (default) or 20 (vigintiles); The score came from |
| Decision curve (glyphscript) | Predicted risk (0–1), Outcome (0/1). Net benefit across thresholds against treat-all and treat-none | The score came from |
| Forest plot (meta-analysis) (glyphscript) | Study, Estimate, CI lower, CI upper, Participants (optional) | Effect measure: Hazard ratio (log scale) (default), Odds ratio (log scale), Risk ratio (log scale), Mean difference, Standardised mean difference or Risk difference; Pooling: Random effects (DerSimonian–Laird) (default), Random effects (REML), Random effects, Hartung–Knapp interval, or Fixed effect (inverse variance) |
The shared options:
| Option | Choices |
|---|---|
| Bar order | Largest first, Smallest first, Category A-Z, Category Z-A, As the rows are |
| Value axis, Y axis, X axis, Response axis (scale) | Linear or Logarithmic |
| The score came from | A model fitted on these same rows (apparent) (the default), Internal validation, Bootstrap validation, Cross-validation (out-of-fold predictions), A held-out split of these rows, An external cohort or A later time period (temporal). It says where the predictions were produced, because a score from a model fitted on the same rows is optimistic |
For the engines behind these charts, see Choosing an engine and Charts and data-visualisation engines.
How generated panels behave
| Behaviour | Detail |
|---|---|
| Verified | Every generated chart is checked against your rows before it is drawn; a chart that does not trace back to the data is refused rather than shown wrong |
| Sized for print | A new panel is drawn for the width one grid column occupies at your journal, with type solved to the journal's minimum size rather than left at the renderer's defaults |
| Linked | The panel remembers a fingerprint of the exact rows and the cleaning they went through, which is what makes Refresh data possible later |
| Captioned | Its caption starts as the chart's title, or as the summary's caption (for example "mean ± SEM, n = 3 mice …") when it charts rows you produced with Summarise for plotting on this figure |
| Refused | A refusal appears in red on the Charts bench, which opens itself so you see it. Where the studio knows the fix, a button above the refusal applies it |
The commonest refusal is a bar chart with error bars over rows that repeat a group: "Error bars need one row per group - the spread is already a summary, and the average of two standard deviations is not a standard deviation. … Summarise on the Analyse bench first." The button beside it, Summarise followed by your value and group columns and as mean ± SEM (for example "Summarise weight by arm as mean ± SEM"), summarises the table in one undoable step; then press Generate panel again. If you declared an experimental unit, the button honours it (it averages within each unit first). To summarise by hand, use Data → Transform → summarise.
The first chart of a session can take a few seconds while the chart renderer loads.
The canvas
The Figure view shows the composed figure exactly as it exports. 100% on this canvas is the true printed size.
| Gesture | Effect |
|---|---|
| Click a panel | Selects it (a rose outline), shows its letter chip and its context toolbar |
| Drag a panel | Reorders it: drop it on another panel's position. Letters follow reading order |
| Drag the round handle on the right of the selected panel | Changes how many grid columns it spans. The layout follows live |
Double-click a panel, or Enter / Space on a focused one | Opens the panel's source in the Inspector, for a panel that has one |
Tab | Moves between panels; focusing a panel selects it |
| Wheel or trackpad pinch | Zooms at the pointer |
Hold Space and drag, or use the Hand | Pans |
Panels that the provenance ledger has something to say about wear a chip at their bottom-right corner:
| Chip | Meaning |
|---|---|
| stale (amber) | A computed result drawn on the panel (a fit, a band, a bracket) was calculated before a column it read changed. Hover for the column |
| orphan (amber) | The ledger entry the panel's drawing cites is no longer in the figure, so whether it still holds cannot be checked |
| untraced (grey) | A pasted SVG or a statistical panel: nothing on this figure records where its content came from |
A current panel wears nothing; the absence is the signal. See Figure analysis and statistics.
View controls
The zoom percentage menu in the view island holds:
| Row | Key | What it does |
|---|---|---|
| Zoom to fit | 1 | Frames the page in the space available |
| Zoom to 100% | 0 | The true printed size |
| Page size | Shows the printed size (for example "85 × 120 mm · Nature") and opens the Page settings | |
| Column guides | G | Draws the grid columns and each panel's data region |
| Millimetre rulers | R | Rulers along the top and left, in page millimetres |
| Colour-vision proof | P | A strip of five copies of the figure: As drawn, Protanopia, Deuteranopia, Tritanopia and Greyscale, simulated with the same tables the Check report measures the palette with. Close puts it away |
| Full screen | Full-screen browser view | |
| Hide interface | ⌥Z | Hides every island except the view island, for looking at the work; Escape or ⌥Z brings them back |
+ (or =) and - zoom in and out. While the column guides are on, or the panels are aligned on their data regions, hovering a plot shows the data value under the pointer, read back through the panel's own axes.
The panel context toolbar
Controls that do not apply to a panel are absent rather than disabled.
| Button | Shown when | What it does |
|---|---|---|
| The panel letter and engine | Always | Which panel, and what drew it |
| Style | The panel is a Vega-Lite chart | Opens the Style inspector |
| Edit source | The panel has a recorded source | Opens the Source editor |
| Refresh from new data | The panel was drawn from your data | Opens the refresh flow |
| Duplicate panel | Always | Copies the artwork, caption, span and source (not the data link) right after the original |
| Copy SVG | Always | Copies the panel's SVG; the button reads Copied briefly |
| Download panel SVG | Always | Saves the panel as a file named from the figure and the panel letter (<figure>-panel-<letter>.svg) |
| Send to… | Always | Sends the panel to another studio. A panel drawn from data travels as its engine source; a pasted one as SVG |
| ⋯ → Remove panel | Always | Removes the panel (Delete on the canvas does the same) |
Working with panels
The Layers bench
The rail's Layers button lists every panel in reading order. With no panels it says "No panels yet."
| Control on a panel's card | What it does |
|---|---|
| The letter button | Selects the panel, which also makes it the flowss Figure Agent's target ("Target this panel for the flowss Figure Agent"); press again to release |
| The caption box (placeholder "Panel A caption") | The panel's own caption, used in the figure legend and the subfigure snippets |
| Span (a number) of the grid's column count | How many of the grid's columns the panel spans |
| The engine tag | What drew the panel |
| Refresh data, Style, Source | Open those editors in the Inspector (shown only where they apply) |
| The download icon | "Download this panel's SVG" |
| Start a new row | Forces this panel to begin a new row |
| Make this a spacer | Turns the cell into empty space that takes no panel letter |
| Height (mm) | A fixed height in millimetres, or auto when left empty |
| Crop | Opens top, right, bottom and left: the percent taken off each side of the panel's own box, up to 45% a side. The crop moves the panel's view box, so it is lossless and undoing it restores detail. The button reads Crop ✓ while a crop is set |
| The frame line | One sentence on what the panel publishes about its data region (for example "Panel A publishes its plot rectangle: …"), or that it publishes none, which means it cannot take part in alignment, shared axes or a computed bracket |
| Bracket lines | The computed significance brackets on this panel. A stale, orphaned or misdrawn bracket shows the Check report's sentence in amber |
| ↑ / ↓ | Move the panel earlier or later |
| The bin icon | Arms on the first click ("Click again to remove") and removes on a second click within about two and a half seconds |
The Style inspector
For a Vega-Lite chart panel, Style opens the Inspector's Style tab, Panel appearance. It changes appearance only: it refuses any change that would move the panel's data, and your choices are carried across a data refresh. Text fields commit when you leave them or press Enter.
| Field | Detail |
|---|---|
| Chart title | Drawn above the panel |
| X axis label, Y axis label | Default is the column name. Disabled with "This panel has no x/y axes." on a chart without them (a pie, for example) |
| Palette | Renderer default, Okabe–Ito (colour-vision safe), Viridis (perceptual, CVD-safe), Cividis (CVD-safe), Plasma (perceptual), Tableau 10, Category 10, Set 2 (soft), Dark 2, Blues (sequential), Greys (print-safe). Custom range (kept from the source) appears only when the source already names its own colours |
| The palette verdict | Read off the drawn figure, never the palette's name: for example "Survives the colour-vision check and greyscale printing." or "Apply to measure — the colour-vision check reads the drawn panel, and this palette is not on it yet." |
| The palette report | The same measured pairs the Check report shows, with Repair palette where a verified repair exists |
| Single colour | A colour picker and Clear. "Applies when nothing else encodes colour." On a panel that colours by a data column it is disabled, and the palette decides the colours |
| Value axis includes zero | "A truncated bar axis manufactures an effect." Unavailable while the log axis is on |
| Logarithmic value axis | "State the base in the legend." |
| Grid lines | On or off |
| Legend | Automatic, Right, Bottom, Top, Left or Hidden |
| Tick label size (units), Axis title size (units) | Drawing units, not points. The hint states the printed size, for example "Prints at ~6.4 pt — this journal's floor is 7 pt." |
| Draw width (px), Draw height (px) | "Sets the panel's aspect." |
| Apply to panel | Re-renders the panel with the new style |
| Defaults | "Clear every visual override" |
| Close | Closes the form without applying |
With no chart panel selected, the tab reads "Select a chart panel to style its titles, axes, palette and type."
The Source editor
Edit source (or Source on a card, or a double-click) opens the Inspector's Source tab with "The" engine's name "source that drew this panel. Edit and re-render — the result is scrubbed before it replaces the artwork." Edit the text and press Re-render, or Cancel. A hand-edited source keeps its data link. An error from the renderer appears under the box and nothing changes. With no panel that has a source selected, the tab reads "Select a panel drawn from source to edit what drew it."
Refresh from new data
A panel drawn from your data can be redrawn from a newer export of the same data, with its styling kept.
- Press Refresh data on the panel's card, Refresh from new data in the toolbar, or the Refresh from new data button on the Source tab.
- Paste the data as it is now, or press Upload file.
- Press Check drift. The drift report says whether the panel can be refreshed ("Compatible — every column this figure reads survives." or "Not refreshable as the data stands.") and what changed: rows added or removed, new or missing columns, and columns whose type changed.
- If it is compatible, press Refresh panel (the button names the panel's letter). Cancel abandons the refresh.
Editing the pasted text after a check clears the drift report, so the panel is never refreshed from rows you did not check.
What a refresh does:
| Effect | Detail |
|---|---|
| Replays your cleaning | The cleaning steps recorded on the old rows are re-applied to the new rows first, and a recorded sort is re-applied |
| Keeps your composition | Letter, caption and span stay; styling is carried onto the new chart |
| Replaces the bench's rows | The refreshed rows become this figure's data |
| Clears analyses | Analyses and cleaning steps that described the old rows are cleared, and a note says so: "Cleared with the rows they described: … Re-run anything you still need on the new data." |
| Re-decides example data | Your own rows clear the example-data mark |
A refresh is refused, with "Refused:" followed by the reason and "The panel is untouched.", when a column the chart reads is missing or changed type, or when the figure was drawn after table edits that cannot be re-applied to new rows (a filter, a cell edit). In that case make the same edits to the new data on the bench and chart it again.
Tip: The Export bench warns when a panel was drawn from rows that have changed since (for example "Panel B was drawn from rows that have changed since. …"). Refresh those panels before you export the repro bundle, so that re-running their sources against the bundled data reproduces them.
Page setup (the Compose bench)
Open the Inspector's Page tab with Page setup…, the Page size row of the zoom menu, or ⌘K → "Compose". From top to bottom:
| Control | What it does |
|---|---|
| Align panels on their data regions | Lines up the plots instead of the panel boxes: each column reserves its widest axis furniture and each row its tallest, so the y axes of stacked panels start at the same x. Needs two panels that publish a plot rectangle ("Two panels that publish a plot rectangle are needed before there is anything to line up."). Panels that cannot align are listed as partly aligned or unaligned, with the reason |
| Share y across, Share x across | Chips for each eligible panel. Claiming two or more panels draws one shared axis, after checking that their scales really are the same; a verdict line says whether the claim was verified. A claim over two different domains is refused in words naming both. Once two panels are claimed, Shared y axis title or Shared x axis title names the shared axis |
| Panel letters | A B C, a b c or 1 2 3, Bold, and a pt size (from the journal's minimum type up to 72, or auto). The row says how the journal letters its panels; when your choice differs, Use it switches to the journal's convention |
| Journal | The preset. A line under it summarises the journal: maximum height, minimum type, line-art dpi, accepted vector formats and colour mode |
| Column fit | The journal's sizes, with their widths. PLOS publishes a width range rather than columns, so its sizes read Narrowest permitted and Widest permitted |
| Grid columns | 1 to 6 |
| Gutter (mm) | 0 to 20 in steps of 0.5 |
| Target dpi | The raster resolution (minimum 72). The line art and halftone buttons beneath set the journal's two floors in one click |
| Figure title and Number | The title names the files and the LaTeX label; the number (1 or more) names submission files (Figure3.tif) |
| Caption | One paragraph. It travels with the figure as metadata and is never drawn into the artwork |
| Generate legend | Composes the legend from the title and panel captions. An empty caption is filled; a caption you wrote is never overwritten silently: an amber box asks Replace the current caption with this legend? with Replace caption and Keep current |
| Copy alt text | Copies an alt-text description of the figure |
| One shared colour key | Reads the colour key out of a chart's own source (the first Vega-Lite chart that has one), turns the charts' own legends off and redraws them so the space returns to the plots, and adds the key as a full-width panel captioned "Key:" and the field's name, because a journal prints one key per figure |
Generate legend, Copy alt text and One shared colour key are disabled until the figure has a panel.
Changing the journal sets the figure's width to the chosen fit's width at the new journal (for PLOS, the widest permitted) and the target dpi to the journal's line-art floor, and re-letters the panels if their style was the previous journal's convention. A letter style you chose yourself stays, and the Check report notes the disagreement. A vector format you picked for the old journal is reset.
Journal presets
Every number is the publisher's own, taken from its artwork guidelines, except where the preset's source note says otherwise; the Check report quotes the source beside every finding. Some values could not be confirmed from the publisher and the source note says so: the whole Springer entry is marked unverified, and the maximum heights of Cell Press and Elsevier are approximations. The Generic preset is not sourced from any publisher.
| Preset | Widths (single / double / full, mm) | Max height (mm) | Min type (pt) | Line art / halftone (dpi) | Vector formats | Colour | Panel letters |
|---|---|---|---|---|---|---|---|
| Nature | 89 / 183 / 183 | 247 | 5 | 600 / 300 | EPS, PDF | RGB or CMYK | a b c |
| Science (AAAS) | 90 / 184 / 184 | 227.5 | 6 | 300 / 300 | PDF, EPS | RGB | A B C |
| Cell Press | 85 / 174 / 174 | 240 | 6 | 1000 / 300 | PDF, EPS | RGB | A B C |
| PNAS | 87 / 178 / 178 | 225 | 6 | 1200 / 300 | EPS, PDF | RGB | A B C |
| Elsevier (generic journal) | 90 / 190 / 190 | 240 | 6 | 1000 / 300 | EPS, PDF | RGB or CMYK | not asserted |
| IEEE | 88.9 / 181.864 / 181.864 | 220 | 8 | 600 / 300 | PDF, EPS | RGB or CMYK | a b c |
| PLOS | 66.802 to 190.5 (a range) | 222.25 | 8 | 300 / 300 | EPS | RGB | not asserted |
| Springer | 84 / 174 / 174 | 234 | 8 | 1200 / 300 | EPS, PDF | RGB | not asserted |
| Generic (no journal selected) | 85 / 175 / 175 | 240 | 7 | 600 / 300 | PDF, SVG, EPS | RGB or CMYK | not asserted |
Every preset except Generic prefers TIFF for rasters; Generic prefers PNG. A new figure starts on Generic (no journal selected), single column, two grid columns, a 4 mm gutter and 600 dpi. Generic is a fallback, not a journal: choose your target before treating a figure as submission-ready.
Note: Several publishers allow a width this three-size model cannot express (Nature's column-and-a-half, Cell Press's 114 mm, Elsevier's 140 mm, Springer's 39 and 129 mm). Individual journals from a publisher can also override the house rules. Check your target journal's own guide for anything unusual.
Annotating
The rail's Annotate button opens the annotation layer: marks that live on the figure, in millimetres, over every panel, so a redraw from new data never takes them with it.
The bench opens with the recommended path for significance: Significance brackets are computed. Run Tukey's HSD, Dunnett's test or Games–Howell on the Analyse bench and press Bracket on a row of its table; the bracket prints that test's adjusted p and cites its ledger entry. Bracket from a test opens the Analyse bench. See Figure analysis and statistics.
To add a mark, press one of the Text, Arrow, Bracket, Typed significance or Scale bar buttons (each marked with a plus). The mark appears a quarter of the way in and about a third of the way down, and is selected. With nothing added, the list reads "Nothing on the layer yet." Press a mark's name in the list to select it and show its fields.
| Field (on a selected mark) | Applies to | Detail |
|---|---|---|
| Text | Text, bracket, typed significance | The words. A new text mark reads "Label"; a typed significance mark reads * |
| What the bar means | Scale bar | The label, for example "10 um" (the default) |
| Length (mm) | Scale bar | From 0.5 mm in steps of 0.5 |
| Type size (pt) | Everything except arrows | Starts at 7 pt or the journal's minimum, whichever is larger. The field's minimum is the journal's floor; a smaller size typed in is reported as a blocking annotation-font-size finding |
| Colour | All | A hex colour, default #000000 |
| Nudge ← → ↑ ↓ | All | Moves the mark 1 mm |
With a mark selected, the arrow keys nudge it 0.1 mm, or 1 mm with ⇧ (not while you are typing in a field). A run of nudges is one undo step. Marks are placed with the nudge controls; they cannot be dragged on the canvas. Selecting a mark deselects any panel and the other way round, so the arrow keys never move both. The bin icon ("Remove this annotation") removes a mark.
Warning: A typed significance mark is typed, not computed: nothing checks it against a test, and the Check report lists every one as such. Use it only over artwork that no test on this figure produced.
Checking against the journal
Figure checks the composed figure continuously against the chosen journal's rules. Open the report from the status badge, from the ⋮ (on a phone), with ⌘K → Run compliance check, or with ⌘K → "Check". The report holds, in order:
| Part | What it shows |
|---|---|
| The readiness card | The figure's level and the reason, plus up to three things still in the way that are not findings (such as a missing caption) |
| I will submit vectors as | SVG (written here), EPS (convert the SVG: no EPS is written here) or PDF (convert the SVG: the PDF written here is raster). Figure writes SVG as its only vector file. A format the journal does not take is marked ", not accepted here". It defaults to SVG where the journal accepts it (the Generic preset) and otherwise to the journal's first format; choosing another makes the check answer for that choice. Changing the journal resets it |
| …in colour space | RGB (what this studio writes) or CMYK (converted elsewhere) |
| Significance marks | Every significance mark on the figure: computed brackets with their test and ledger entry, and typed marks as "typed, not computed". A bracket whose drawing no longer matches its record offers Redraw brackets |
| The palette report | The figure's colours as swatches, the confusable pairs worst first with their ΔE2000 distance under normal vision and each deficiency, any panel read as a colour ramp, the greyscale reading, whether colour is the only channel, and Repair palette with the number of colours and the exact swaps when a verified repair exists |
| The findings | A count line (for example "2 blocking issues · 3 warnings", or "No blocking issues · 1 warning"), then each finding with its rule, the journal's wording, the fix and, where possible, a repair button |
When nothing is found the report says No issues found. and explains its limits: type size is read off the text a panel contains, resolution off the images it embeds, and colour-vision safety off the colours it uses more than one of. "Absent is untested, not cleared."
Readiness levels
| Level | Meaning |
|---|---|
| Empty | No panels yet |
| Draft | At least one blocking rule fires |
| Sound | Every panel passes the blocking rules, but there is no caption or there are warnings |
| Reviewed | Clean and captioned; provenance is the last gap (a panel carries no source, or was drawn from rows that have since changed) |
| Publishable | Clean, captioned, and every panel traceable to the data that drew it |
The rules
| Rule id | Severity | What it checks | One-click repair |
|---|---|---|---|
journal-known | Error | The journal preset is one Figure knows | Switch to the Generic preset |
no-panels | Warning | The figure has panels; with none, only width, height, dpi and format were checked | |
column-width | Error | The width matches a size the journal publishes (or sits inside PLOS's range) | Use the journal's size, or set the width |
max-height | Error | The composed height is within the journal's maximum | Tile onto more columns, where that would fit |
panel-off-figure | Error | No panel sits past the right edge (too many columns or too wide a gutter) | |
panel-viewbox | Warning | Each panel has a readable view box, so its height is not a guess | |
min-font-size | Error (warning when a panel's scale cannot be measured) | The smallest text in each panel prints at or above the journal's minimum | Raise this panel's type |
min-font-size-css | Warning | A <style> rule's font size prints below the minimum | Raise this panel's type |
min-font-size-transform | Warning | Text under a transform whose printed size cannot be measured | |
text-overflow | Error or warning | A label runs past its panel, past its plot, or overlaps another label | |
text-contrast | Warning | Text has enough contrast against what it sits on (WCAG 2.1, 4.5:1) | |
target-dpi | Error or warning | The target dpi clears the journal's lower floor (error below it) and its line-art floor (warning between the two) | Set the target to the line-art dpi |
raster-resolution | Error or warning | Embedded images have enough pixels for the millimetres they occupy, and are embedded rather than linked | |
dropped-reference | Error or warning | A panel does not depend on references that were removed on the way in | |
vector-format | Error | The journal accepts the vector format you will submit | Submit an accepted format instead |
vector-not-produced | Warning | The audited vector format is one Figure does not write (EPS, or a true vector PDF) | Submit SVG instead, where the journal accepts SVG |
colour-mode | Warning | Your colour space matches what the journal asks for | Submit the RGB files as exported |
panel-letter-convention | Warning | Panel letters follow the journal's convention, where one is known | Letter the panels the journal's way |
annotation-font-size | Error | Annotation text is at or above the minimum | Raise this mark |
annotation-off-figure | Warning | No annotation runs off the figure's edge | |
colour-blind-safe | Warning | Colour pairs stay distinguishable under the three dichromacies | Repair palette |
colour-only-channel | Warning | Colour is not the only thing telling the series apart | |
greyscale-safe | Warning | Series do not merge in a black-and-white print | |
svg-conformance | Error or warning | The markup renders the same outside a browser |
Repairs are undoable with ⌘Z. Repair buttons appear on warnings as well as errors. Repair palette recolours every panel with the same old → new table, so one category stays one colour across panels; for a chart drawn from your data it changes the chart's source, so a later refresh does not bring the old colours back. If a restyled chart will not render, its drawn colours are swapped instead and a note says which panel.
Exporting
Press Export (or ⋮ → Export ▸, or ⌘K). The popover is titled Export followed by the figure's name.
The export gate
If a blocking rule fires, the bench opens with Export blocked and the number of rules (for example "Export blocked — 2 rules"), and the line "The journal will not take this figure as it stands. Each rule below is the journal's, not ours." (with your journal's name). Each finding is listed with its fix and repair button. The artwork exports (SVG, PNG, TIFF, PDF, the manuscript ZIP and the repro bundle) stay unavailable, from the buttons and from the ⋮ and ⌘K alike, until you either repair the findings or press the waiver button: "Export anyway — I have read this violation" (or "… these 3 violations", counting the findings).
Exporting anyway records a waiver in the figure. Waivers are listed in amber (for example "2 waived findings — named in preflight.txt and the bundle README") with Withdraw on each. A waiver covers exactly the finding you read: if the figure changes so that the finding is different, or a new finding of the same rule appears, the gate closes again and asks for a fresh acknowledgement. Only errors block; warnings never do. Data (CSV) is never gated. A refused export from the menu or ⌘K shows the gate's reason as a toast.
What you can export
| Control | What you get |
|---|---|
| SVG | The composed figure at its real millimetre size, as <figure>.svg |
| PNG @ the target dpi | The figure rasterised at the target dpi with its resolution written into the file, as <figure>-<dpi>dpi.png |
| The journal's submission preset box | A line summarising what the journal wants: raster format and dpi, vector format (marked "not written here: convert the SVG" when Figure does not write it), colour mode, smallest type and the file name it expects |
| TIFF @ the target dpi | A baseline TIFF (RGB, PackBits compression, resolution tags) at the target dpi, named for submission (Figure2.tif, or the figure's name when it has no number) |
| PDF at the width in mm | A page exactly the printed size, with the artwork rasterised at the target dpi inside it. It is not vector line art; if your journal needs vector, open the exported SVG in Illustrator or Inkscape and save as PDF from there |
| All N figures + preflight (ZIP) | Every figure in the manuscript: its SVG, its raster (TIFF or PNG, as each journal prefers), its PDF, manifest.json and one preflight.txt. A figure with no panels contributes only its SVG and its section of the report. Named after the figure on screen (<figure>-figures.zip). While writing it reads Writing every figure… |
| LaTeX | A figure float including the PDF, with caption and label, and a comment naming the packages it needs |
| Subfigures | One subfigure per panel laid out on your grid, each including that panel's downloaded SVG through the svg package, each with its own label |
| Markdown | A Pandoc/Quarto image with a cross-reference id ({#fig-…}) and the width in millimetres, pointing at the PNG |
| Caption | The caption text |
| Methods paragraph | The Methods text for this figure's data and analyses. Available once there is an analysis or a data-ledger line. See Figure analysis and statistics |
| Repro bundle | <figure>-bundle.zip: README.md, figure.svg, manifest.json, data.csv (when the figure has rows), data-preparation.txt (when the ledger has steps) and a source/ folder with each panel's engine source |
| Data (CSV) | The rows on the bench as a CSV file, normally dataset.csv. Disabled with no rows |
| Send to… | Shown once there is a panel. Sends the whole composition to another studio as one SVG document, with a conversion preview |
The copy buttons read Copied for a moment. LaTeX, Subfigures and Markdown need at least one panel; Caption does not. The snippets point at exactly the file names the buttons save, so a pasted snippet finds its file.
Under the buttons, a paragraph says what the bundle carries for this figure, including how many panels have an engine source, and that everything in it is this figure's own: its rows, its ledger and its analyses. If any panel was drawn from rows that have changed since, an amber note names it and suggests Refresh data first. At the foot of the popover, Data ledger — followed by the figure's name lists the last eight operations recorded on the rows.
The manuscript ZIP and preflight.txt
The manuscript ZIP is gated on every figure, not just the one on screen. If another figure breaks its journal's rules, the button is unavailable and the reason under it names the figures, for example: "Export blocked — 1 of 3 figures breaks the journal's rules. Figure 3: min-font-size." Switch to that figure to repair it.
preflight.txt is a plain-text report a production desk and co-authors can read: for each figure, the settings it was exported at, its findings, any waivers quoted verbatim under "WAIVED BY THE AUTHOR", panels drawn from rows that changed since, and the journal page the rules came from. Its vector line always names the file Figure actually writes ("Vector format: svg — the .svg in this export"); when the journal takes something else, a "Journal takes:" line names the journal's formats and says to convert the .svg (in Illustrator or Inkscape). manifest.json records the same: vectorFormat is "svg", with journalVectorFormats and convertVectorTo. An empty findings list is reported as "No rule fired. That is not the same as correct": the checker measures size, type, resolution, format and colour separation, not the science.
The reproducibility bundle
The README lists every file and says how to redraw the figure: run each file in source/ against data.csv, and re-compose at what manifest.json records. It says plainly how many panels carry a source (a pasted SVG and a statistical panel have none, and travel as artwork only), names waivers, and names panels drawn from rows that have changed. In data.csv and the Data CSV export, a text cell that begins with =, +, -, @, a tab or a carriage return gets a leading apostrophe so a spreadsheet opens it as text rather than running it as a formula; numbers are never changed.
File names
| File | Name |
|---|---|
| SVG, repro bundle | From the figure title, lower-cased and hyphenated (monthly-revenue-by-region.svg); an untitled figure uses its number (figure-3) or figure |
| PNG | <figure>-<dpi>dpi.png |
| TIFF, PDF, and files inside the manuscript ZIP | Figure<number> when the figure has a number, otherwise from the title |
| Panel SVGs | <figure>-panel-<letter>.svg, unique even when two panels share a letter |
Sending the figure on
| Destination | How | What arrives |
|---|---|---|
| Studio, Weave, Lab, BPMN, Science | ⋮ → Send to ▸, or Send to… in the Export popover | The composed figure as SVG. A studio that needs its own notation gets a converted copy; converting SVG uses AI (your own key or AI points). See Moving work between studios |
| Evidence | The same menus | An evidence scaffold from the figure |
| Study | ⋮ → Send to ▸ → Study this figure, or ⌘K | The figure's story rather than its artwork: title, caption, panel captions, each analysis and the Methods paragraph, from which Study builds a course. The toast reads "Sent to Study — it will build a course from this figure" |
Figure itself cannot receive diagrams from the Send to menus of other studios; it receives datasets (see Rows from other studios).
The Figure analyst
The prompt at the bottom of the canvas, Ask the flowss Figure Agent…, opens a sheet titled flowss Figure Agent — Figure analyst with two tabs. Enter sends, ⇧Enter adds a line, Escape closes the sheet. Typing in the prompt sends your request to the AI chat tab.
| Part | What it is |
|---|---|
| Suggestion chips | Over an empty figure on the Figure view, up to three of the Advisor's next moves appear above the prompt. Press one to do it. The cross hides them |
| AI settings (the settings button on the prompt) | Research discipline and its Field notes. The discipline orders the Advisor's suggestions and its preferred charts |
| Advisor tab | Deterministic next moves from your data, analyses, composition and the journal check. No AI, works offline, same answer every time |
| AI chat tab | The flowss Figure Agent, working as the platform's tool-using Data & charts specialist, writing real chart source against your rows |
| Tune for a discipline | Offered when your column names suggest a different discipline; never imposed |
The disciplines are General research, Medicine & clinical research, Public health & epidemiology, Biology & life sciences, Psychology & behavioural science, Engineering & materials, Physics, Chemistry, Environmental science, Business & marketing analytics, Economics, Social science & survey research, and Data science & machine learning.
The Advisor
The Advisor shows up to ten cards, each labelled with its area (Data, Clean, Analyse, Chart, Compose or Check), a title and a detail line. A card with an action has Do it (it reads Working… while running). It proposes, in order: up to three cleaning fixes, up to four analyses your columns support (a comparison of groups is always the assumption gate's pick, with the reason, and a sheet whose only numbers are counters says "No measured column to test yet"), two recommended charts ("Draw:" and the chart), composition gaps (no panels yet, or Generate the figure legend when there is no caption), and up to three blocking findings with their repairs (for a dpi finding, "Raise export resolution to" the line-art dpi) or a "no one-click fix" note. When it has nothing to propose it says so, and says that silence is not a pass. See Figure analysis and statistics.
The AI chat
The flowss Figure Agent works on the selected panel's source. With no panel selected, it starts from a chart scaffold carrying up to 150 of your rows (fewer if they are large, as few as ten), and it is told exactly how many rows it has, so it does not state totals for rows it never saw. Whatever comes back is re-rendered and cleaned before it becomes a panel: it replaces the selected panel, or becomes a new panel when none is selected, and the canvas switches to the Figure view. Revert this run ("Undo everything this run changed") takes a run back; for a run that created a panel, that panel is removed. The chat offers examples such as "Chart the strongest relationship in this dataset", "Grouped bar chart with the y-axis starting at zero, units in the label" and "Restyle the selected panel for print: bigger type, colour-blind-safe palette". A chart the AI rewrote drops its data link, so Refresh data no longer applies to it.
AI needs your own key (Starter) or hosted AI points (Plus and up). See AI points and limits and Bring your own AI key.
Saving, syncing and history
| Topic | Detail |
|---|---|
| Autosave | Every change is saved in this browser about 0.4 seconds after you pause, and again when you leave the page or close the tab |
| What is saved | The composition, the whole project with every figure, and each figure's analysis bench |
| Other devices | Picked up by your workspace sync. See Cloud sync, offline work and devices |
| Checkpoints | Open the Flow Dock with ⌘J to save a named Vault checkpoint of the whole project. See Version history and undo |
| The Library | Each figure that holds work is a card in the Library, with the composed figure as its thumbnail. Opening the card opens that figure in Figure. Renaming the card renames the figure, and renaming the figure renames the card. Duplicate makes a separate figure. Deleting a figure in Figure moves its card to the Library's trash, and trashing or purging the card in the Library removes the figure the next time Figure opens. A version restored from the card's history is carried back into Figure. Library backups include your figures |
| Undo | 50 steps of data changes (while the table is up) and 50 of composition changes (while the figure is up). Typing in a caption is not an undo step; a run of edits to one number field is one step. Switching figure clears both histories |
| Two tabs | If the project is changed in another tab or synced from another device, a warning says to reload, because this tab's next save would otherwise overwrite it |
Warning: If storage fills up, the badge turns to Not saved ("Storage is full — export to keep this work"). Export the repro bundle or the manuscript ZIP straight away, then free space by deleting figures you no longer need or very large images.
Keyboard shortcuts
| Key | Action |
|---|---|
V | Select (puts the Hand down) |
H | Hand tool on or off |
Space (hold) | Pan while held |
+ or = / - | Zoom in / out |
0 | Zoom to 100% (true print size) |
1 | Zoom to fit |
G | Column guides |
R | Millimetre rulers |
P | Colour-vision proof |
← / → with a panel selected | Move it earlier / later |
← / → on the span handle | One column narrower / wider |
Delete or Backspace | Remove the selected panel |
Escape | Clear the selection |
| Arrow keys with an annotation selected | Nudge 0.1 mm (⇧ for 1 mm) |
⌘Z / ⇧⌘Z (or ⌘Y) | Undo / redo the table or the composition, whichever is showing |
⌥⌘← / ⌥⌘→ | Previous / next figure |
⌥↑ / ⌥↓ on a switcher row | Reorder figures |
⌘K | Every command and screen |
⌘J | The Flow Dock |
⌥Z | Hide the interface (Escape or ⌥Z brings it back) |
Canvas keys are ignored while you type in a field. See Keyboard shortcuts.
Tips
- Pick the journal first. The width, the target dpi, the panel letters and the type size a new chart is drawn at all follow it.
- Use the line art dpi for anything with axes or lettering; the halftone dpi is only for figures that are entirely photographic.
- Give each figure a Number before the final export, so the TIFF and PDF are named
Figure1.tifand so on, the way submission systems expect. - Turn on Column guides (
G) and Align panels on their data regions for multi-panel time courses; the y axes then start at the same place. - Use One shared colour key rather than a legend in every panel.
- Run the Colour-vision proof (
P) before you send a figure out; it shows the same simulation the Check report measures. - Prefer computed brackets from the Analyse bench to typed significance marks: a computed bracket can never print a p its test did not produce.
- Keep a Vault checkpoint before a risky change, and export the repro bundle with every submission.
Limits and known constraints
| Limit | Value or behaviour |
|---|---|
| Plan | Starter and above |
| Figures per project | 12 |
| Rows and columns | 200,000 rows, 256 columns |
| Rows saved in this browser | Up to about 750,000 characters of data per figure; more is kept for the session only |
| Rows handed in from another studio | About 600 KB of text |
| Image panels | PNG, JPEG, GIF, WebP; 12 MB each |
| Grid | 1 to 6 columns; gutter 0 to 20 mm |
| Crop | Up to 45% off each side |
| PNG, TIFF and PDF size | Limited by what a browser canvas can hold (about 268 megapixels, and 65,535 pixels on a side). SVG has no resolution limit |
| Raster inside a page of the printed size, not vector line art | |
| EPS | Not written. Convert the SVG yourself where a journal requires EPS. Because none of the eight journal presets accepts SVG, a figure set to a real journal carries a vector-not-produced warning by default. It is advisory and never blocks: submit the TIFF, or convert the SVG |
| CMYK | Not written. Every file is RGB; convert in a colour-managed application with the journal's profile |
| Annotations | Positioned by nudging; not draggable on the canvas |
| Pasted SVG, images and statistical panels | Cannot be restyled or refreshed from new data. Pasted SVG and statistical panels carry no source at all |
| Collaboration | No live sessions, comments or share links in Figure |
| Library | Each figure is a Library card. When you are signed in, figure cards are synced after every other studio's Library documents, within the Library's sync budget. A figure whose card did not sync appears on your other device, as the same card, the first time you open Figure there |
| Undo | 50 steps each for data and composition; cleared when you switch figure |
Troubleshooting
| You see | Why | What to do |
|---|---|---|
| "No rows found — is the first line a header?" or "Couldn't parse: …" | The text could not be read as a table | Make sure the first line is a header and the rows are delimited consistently |
| "Invalid JSON: …", "This JSON is a single value, not a table." or "The JSON array is empty — no rows to chart." | The JSON is malformed or holds no rows | Supply an array of row objects |
| "This JSON is an object, not a table — expected an array of row objects (or {data: [...]})." | JSON in the wrong shape | Supply an array of row objects, or wrap it under data, rows, values or records |
| "That's N rows — the limit is 200,000. Take a sample or aggregate first." | Too many rows | Sample or aggregate before importing |
| "N columns — the limit is 256." | Too many columns | Reduce the columns |
| "That file could not be read: …" | The browser could not read the file | Try the file again, or paste its contents |
"That doesn't look like an SVG — paste a complete <svg>…</svg> document." | The pasted text has no SVG root | Paste the whole SVG document |
| "No browser draws TIFF inside a figure…" (or HEIC, a Photoshop document, a raw file) | The format cannot be embedded | Convert to PNG or JPEG |
| "…over the 12 MB a panel can hold…" | The image is too large | Downsample to the pixel width the journal needs |
| "That file's pixel dimensions could not be read from its header…" | The image header is unreadable | Re-save it as a plain PNG or JPEG |
| "Error bars need one row per group…" | Repeated group rows on an error-bar chart | Press the Summarise … as mean ± SEM button, then generate again |
| "Refused: …. The panel is untouched." | A data refresh would break the chart | Follow the reason: restore the missing column, or redo table edits on the new rows and chart again |
| "A shared key is read from a chart's own source; this figure has no Vega-Lite panel." | No chart panel to read a key from | Draw a chart panel from your data first |
| "The key was added, but … the figure now shows the key twice" | A panel could not be redrawn without its own legend | Hide that panel's legend in Style, or remove the key panel |
| "The key uses Vega-Lite's default categorical colours, because that panel names none of its own…" | The chart sets no colours of its own, so the key used the renderer's defaults | Compare the key with the panel before submitting, or set a palette in Style and add the key again |
| Export blocked with a rule count | A blocking rule fires | Press each repair, fix by hand, or press the Export anyway button to record a waiver |
| "Export blocked — 1 of 3 figures breaks the journal's rules. …" | Another figure in the manuscript breaks a rule | Switch to the named figure and repair it |
| "… megapixels, past the 268.4 a browser canvas can hold…" or "The browser refused to encode a … canvas" | The figure is too large at this dpi for a raster | Export SVG, or lower the target dpi to the number suggested |
| "Clipboard blocked — copy from the preview instead." | The browser refused clipboard access | Allow clipboard access for the site, or copy by hand |
| "A project holds 12 figures — export or remove one before adding another." (or "… remove one before duplicating.") | The project is full | Delete a figure you no longer need |
| A toast saying a chart, fit or run "was for" another figure and "was not applied" | The work finished after you switched figure | Switch back and try again |
| "This figure project was changed in another tab or synced from another device…" | Two tabs, or a sync, changed the project | Reload before you make more changes |
| Not saved in the badge | Browser storage is full | Export now, then free space |
| "Nothing to study yet — give the figure a title, a legend or an analysis first." | Study this figure had nothing to send | Add a title, caption or analysis |
| "Couldn't stage the figure (storage full)." | Browser storage could not hold the hand-off to Study | Free space, then try again |
| The Chart button is disabled ("Bring data in first") | There is no data | Bring data in first |
