---
title: Building infographics and charts with Muse Image — Muse Image | Runware Docs
url: https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts
description: "How to build data-accurate charts and infographics with Muse Image: what settings.shell does, how to write your figures into the prompt, and when to switch it off."
---
### [Introduction](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#introduction)

Ask most image models for a bar chart and you get a picture of a bar chart. The bars **land at plausible-looking heights** rather than the ones your numbers imply, the value labels drift off the series, a legend invents a category that was never in the data, and a table's columns stop lining up two rows down. Nothing in the figure was ever computed.

Muse Image can run code before it renders. With `settings.shell` enabled, which is the default, the model **writes and executes code to build the figure**, then renders the image conditioned on what that code produced. Bar heights follow the numbers you supplied rather than the composition, and a QR code comes back as **a real matrix that scans**.

![A landscape quarterly business review sheet on an off-white background with a navy header bar reading Northpeak Q3 business review, four KPI tiles across the top showing monthly recurring revenue $2.4M, net revenue retention 114%, active workspaces 8,420 and support CSAT 4.6 out of 5, a three-column chart of new workspaces by month below them, and a small revenue by plan table to its right](https://runware.ai/docs/assets/hero.Cvu0UmrP_1XMPQB.jpg)

> **Prompt**: A quarterly business review one-pager for a B2B SaaS product called "Northpeak". Landscape sheet on an off-white background with a thin navy header bar reading "Northpeak Q3 business review". A row of four KPI tiles across the top: "Monthly recurring revenue $2.4M", "Net revenue retention 114%", "Active workspaces 8,420", "Support CSAT 4.6 / 5". Below the tiles, a column chart titled "New workspaces by month" with three columns labelled Jul 610, Aug 745, Sep 903, each value printed above its column. To the right of the chart, a three-row table titled "Revenue by plan" with the rows "Scale $1.12M", "Growth $840K", "Starter $440K". Muted navy and slate grey with a single amber accent, generous white space, flat vector infographic style, crisp sans-serif typography, print quality.

The sheet above is one call. A header bar, four KPI tiles, a labelled column chart, and a small revenue table all land in a single pass, carrying **the figures the prompt supplied** rather than figures that look about right.

This guide covers what the code tool changes on an identical prompt, how to hand the model data it renders instead of invents, the layouts that lean on the code path hardest, and the case for switching it off.

### [The request](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#the-request)

An infographic is an ordinary `imageInference` call. The prompt carries the layout and the data, `width` and `height` come from the model's fixed pixel-pair list, and the code tool needs **no flag to switch on**.

TypeScriptPythoncURLCLIJSON

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'meta:muse@image',
  positivePrompt: 'A quarterly business review one-pager for a B2B SaaS product called "Northpeak". Landscape sheet on an off-white background with a thin navy header bar reading "Northpeak Q3 business review". A row of four KPI tiles across the top: "Monthly recurring revenue $2.4M", "Net revenue retention 114%", "Active workspaces 8,420", "Support CSAT 4.6 / 5". Below the tiles, a column chart titled "New workspaces by month" with three columns labelled Jul 610, Aug 745, Sep 903, each value printed above its column. To the right of the chart, a three-row table titled "Revenue by plan" with the rows "Scale $1.12M", "Growth $840K", "Starter $440K". Muted navy and slate grey with a single amber accent, generous white space, flat vector infographic style, crisp sans-serif typography, print quality.',
  width: 1792,
  height: 1344
})
```

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "meta:muse@image",
            "positivePrompt": "A quarterly business review one-pager for a B2B SaaS product called \"Northpeak\". Landscape sheet on an off-white background with a thin navy header bar reading \"Northpeak Q3 business review\". A row of four KPI tiles across the top: \"Monthly recurring revenue $2.4M\", \"Net revenue retention 114%\", \"Active workspaces 8,420\", \"Support CSAT 4.6 / 5\". Below the tiles, a column chart titled \"New workspaces by month\" with three columns labelled Jul 610, Aug 745, Sep 903, each value printed above its column. To the right of the chart, a three-row table titled \"Revenue by plan\" with the rows \"Scale $1.12M\", \"Growth $840K\", \"Starter $440K\". Muted navy and slate grey with a single amber accent, generous white space, flat vector infographic style, crisp sans-serif typography, print quality.",
            "width": 1792,
            "height": 1344
        })

asyncio.run(main())
```

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "4c1d9e2f-7a3b-4e58-9c60-1d2e3f4a5b6c",
      "model": "meta:muse@image",
      "positivePrompt": "A quarterly business review one-pager for a B2B SaaS product called \"Northpeak\". Landscape sheet on an off-white background with a thin navy header bar reading \"Northpeak Q3 business review\". A row of four KPI tiles across the top: \"Monthly recurring revenue $2.4M\", \"Net revenue retention 114%\", \"Active workspaces 8,420\", \"Support CSAT 4.6 / 5\". Below the tiles, a column chart titled \"New workspaces by month\" with three columns labelled Jul 610, Aug 745, Sep 903, each value printed above its column. To the right of the chart, a three-row table titled \"Revenue by plan\" with the rows \"Scale $1.12M\", \"Growth $840K\", \"Starter $440K\". Muted navy and slate grey with a single amber accent, generous white space, flat vector infographic style, crisp sans-serif typography, print quality.",
      "width": 1792,
      "height": 1344
    }
  ]'
```

```bash
runware run meta:muse@image \
  positivePrompt="A quarterly business review one-pager for a B2B SaaS product called \"Northpeak\". Landscape sheet on an off-white background with a thin navy header bar reading \"Northpeak Q3 business review\". A row of four KPI tiles across the top: \"Monthly recurring revenue \$2.4M\", \"Net revenue retention 114%\", \"Active workspaces 8,420\", \"Support CSAT 4.6 / 5\". Below the tiles, a column chart titled \"New workspaces by month\" with three columns labelled Jul 610, Aug 745, Sep 903, each value printed above its column. To the right of the chart, a three-row table titled \"Revenue by plan\" with the rows \"Scale \$1.12M\", \"Growth \$840K\", \"Starter \$440K\". Muted navy and slate grey with a single amber accent, generous white space, flat vector infographic style, crisp sans-serif typography, print quality." \
  width=1792 \
  height=1344
```

```json
{
  "taskType": "imageInference",
  "taskUUID": "4c1d9e2f-7a3b-4e58-9c60-1d2e3f4a5b6c",
  "model": "meta:muse@image",
  "positivePrompt": "A quarterly business review one-pager for a B2B SaaS product called \"Northpeak\". Landscape sheet on an off-white background with a thin navy header bar reading \"Northpeak Q3 business review\". A row of four KPI tiles across the top: \"Monthly recurring revenue $2.4M\", \"Net revenue retention 114%\", \"Active workspaces 8,420\", \"Support CSAT 4.6 / 5\". Below the tiles, a column chart titled \"New workspaces by month\" with three columns labelled Jul 610, Aug 745, Sep 903, each value printed above its column. To the right of the chart, a three-row table titled \"Revenue by plan\" with the rows \"Scale $1.12M\", \"Growth $840K\", \"Starter $440K\". Muted navy and slate grey with a single amber accent, generous white space, flat vector infographic style, crisp sans-serif typography, print quality.",
  "width": 1792,
  "height": 1344
}
```

Response

```json
[
  {
    "taskType": "imageInference",
    "taskUUID": "4c1d9e2f-7a3b-4e58-9c60-1d2e3f4a5b6c",
    "imageUUID": "a7b8c9d0-1e2f-4a3b-8c5d-6e7f8a9b0c1d",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/a7b8c9d0-1e2f-4a3b-8c5d-6e7f8a9b0c1d.jpg"
  }
]
```

- `positivePrompt` holds **both the layout and the figures**. It takes up to 200,000 characters, so a full specification fits comfortably and a short one leaves the model room to invent.
- `settings.shell` defaults to `true`. Leave it there for anything with a number or a grid in it.
- `width` and `height` accept **only eight pixel pairs**. This sheet uses 1792 × 1344 and a poster wants 1280 × 1920. The [model reference](https://runware.ai/docs/models/meta-muse-image) lists all eight.
- `resolution: "2K"` is the other sizing mode. It requires reference images and is covered in [multi-reference composition](https://runware.ai/docs/models/meta-muse-image/guides/multi-reference-composition).

Image tasks are synchronous, so the response carries the finished `imageURL` with no polling step.

### [What the code tool changes](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#what-the-code-tool-changes)

The pair below is **one prompt run twice**, once on the default and once with `settings.shell` set to `false`. The prompt names six months and six values: Jan 1,240, Feb 1,410, Mar 1,880, Apr 2,050, May 2,390, Jun 3,120.

Identical prompt, identical dimensions. The only difference between the two calls is `settings.shell`.

![A white card holding a teal bar chart titled Weekly active teams, with six bars labelled Jan to Jun rising steadily, each carrying a printed value above it and sitting against gridlines running from 0 to 3,500](https://runware.ai/docs/assets/output-shell-on.BaIFyBgu_Z1mRs4w.jpg)

*settings.shell: true*

> **Prompt**: A bar chart card for a product marketing deck, titled "Weekly active teams". Six vertical bars labelled Jan, Feb, Mar, Apr, May and Jun with the values Jan 1,240, Feb 1,410, Mar 1,880, Apr 2,050, May 2,390 and Jun 3,120, each value printed above its bar. Y axis running 0 to 3,500 with gridlines every 500. Deep teal bars on a white card with a soft drop shadow, thin grey gridlines, clean sans-serif labels, flat vector chart style, generous margins.

![A white card holding a teal bar chart titled Weekly active teams with six labelled bars, drawn with even step heights that do not track the printed values above them](https://runware.ai/docs/assets/output-shell-off.2MLgUR3y_Z2cK0as.jpg)

*settings.shell: false*

> **Prompt**: A bar chart card for a product marketing deck, titled "Weekly active teams". Six vertical bars labelled Jan, Feb, Mar, Apr, May and Jun with the values Jan 1,240, Feb 1,410, Mar 1,880, Apr 2,050, May 2,390 and Jun 3,120, each value printed above its bar. Y axis running 0 to 3,500 with gridlines every 500. Deep teal bars on a white card with a soft drop shadow, thin grey gridlines, clean sans-serif labels, flat vector chart style, generous margins.

June is **two and a half times January** in the series, and on the code-built card the bars carry that ratio: the March bar clears the halfway gridline, the June bar stops just short of the top. The drawn version keeps the labels and the general climb, but the bar heights answer to the composition rather than to the numbers, and the gap between May and June flattens out.

Underneath, the code path is a plot rather than a drawing. The model **writes code that produces the figure**, runs it, reads back what it got, and renders the final image conditioned on that result.

That path is what carries anything built out of numbers or geometry: charts, tables, calendars, org charts, seating maps, and QR codes.

### [Writing the data into the prompt](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#writing-the-data-into-the-prompt)

The code tool computes what you give it. It does not reconstruct a series you left out, so **every value has to be in the prompt**. A chart prompt is really five things stacked together.

**[Chart type]** A horizontal bar chart for a SaaS product report, **[Title]** titled "Feature adoption, 90 days after launch", **[Data]** six bars with the labels and values "Shared inbox 78%", "Automations 64%", "Custom fields 51%", "Time tracking 37%", "Public API 22%" and "Mobile offline 14%", **[Axis]** each percentage printed at the end of its bar, x axis running 0 to 100% with light gridlines every 20%, **[Style]** indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins

![A horizontal bar chart on a white background titled Feature adoption, 90 days after launch, with six indigo bars for shared inbox, automations, custom fields, time tracking, public API and mobile offline, each ending in a printed percentage against gridlines every 20 percent](https://runware.ai/docs/assets/output-chart-adoption.DLUt_5-T_Z11KRsR.jpg)

*Six labels, each carrying its own value*

> **Prompt**: A horizontal bar chart for a SaaS product report, titled "Feature adoption, 90 days after launch". Six bars with the labels and values "Shared inbox 78%", "Automations 64%", "Custom fields 51%", "Time tracking 37%", "Public API 22%" and "Mobile offline 14%", each percentage printed at the end of its bar. X axis running 0 to 100% with light gridlines every 20%. Indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins.

**Read the bars off the render** and check them against the list you sent: Shared inbox 78%, Automations 64%, Custom fields 51%, Time tracking 37%, Public API 22%, Mobile offline 14%. The bottom bar should stop a shade under a fifth of the way across, and the top bar should land between the 60% and 80% gridlines. Four habits keep that check passing.

- **Pair every label with its value** inside the same clause. "Automations 64%" holds together. A list of six labels followed by a separate list of six numbers gets mismatched somewhere in the middle.
- **State the axis range and the unit.** Left to itself the model picks a scale, and a bar chart that starts at 40 instead of 0 exaggerates every difference in the series.
- **Name the chart form.** "Horizontal bar chart" or "stacked column chart" fixes the shape. "A chart of feature adoption" leaves it open and you get a different one each run.
- **Keep the printed strings short.** Long axis labels and multi-line legends are where rendered text degrades, and a shorter label leaves the code tool more room to place the value cleanly.

When the numbers are yours, `settings.webSearch: false` **stops the model reaching outside the prompt** to reconcile them against anything. Search earns its place when the chart is about public data instead, which is [grounded generation](https://runware.ai/docs/models/meta-muse-image/guides/grounded-generation).

TypeScriptPythoncURLCLIJSON

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'meta:muse@image',
  positivePrompt: 'A horizontal bar chart for a SaaS product report, titled "Feature adoption, 90 days after launch". Six bars with the labels and values "Shared inbox 78%", "Automations 64%", "Custom fields 51%", "Time tracking 37%", "Public API 22%" and "Mobile offline 14%", each percentage printed at the end of its bar. X axis running 0 to 100% with light gridlines every 20%. Indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins.',
  width: 1920,
  height: 1280,
  settings: {
    shell: true,
    webSearch: false
  }
})
```

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "meta:muse@image",
            "positivePrompt": "A horizontal bar chart for a SaaS product report, titled \"Feature adoption, 90 days after launch\". Six bars with the labels and values \"Shared inbox 78%\", \"Automations 64%\", \"Custom fields 51%\", \"Time tracking 37%\", \"Public API 22%\" and \"Mobile offline 14%\", each percentage printed at the end of its bar. X axis running 0 to 100% with light gridlines every 20%. Indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins.",
            "width": 1920,
            "height": 1280,
            "settings": {
                "shell": True,
                "webSearch": False
            }
        })

asyncio.run(main())
```

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "9e0f1a2b-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
      "model": "meta:muse@image",
      "positivePrompt": "A horizontal bar chart for a SaaS product report, titled \"Feature adoption, 90 days after launch\". Six bars with the labels and values \"Shared inbox 78%\", \"Automations 64%\", \"Custom fields 51%\", \"Time tracking 37%\", \"Public API 22%\" and \"Mobile offline 14%\", each percentage printed at the end of its bar. X axis running 0 to 100% with light gridlines every 20%. Indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins.",
      "width": 1920,
      "height": 1280,
      "settings": {
        "shell": true,
        "webSearch": false
      }
    }
  ]'
```

```bash
runware run meta:muse@image \
  positivePrompt="A horizontal bar chart for a SaaS product report, titled \"Feature adoption, 90 days after launch\". Six bars with the labels and values \"Shared inbox 78%\", \"Automations 64%\", \"Custom fields 51%\", \"Time tracking 37%\", \"Public API 22%\" and \"Mobile offline 14%\", each percentage printed at the end of its bar. X axis running 0 to 100% with light gridlines every 20%. Indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins." \
  width=1920 \
  height=1280 \
  settings.shell=true \
  settings.webSearch=false
```

```json
{
  "taskType": "imageInference",
  "taskUUID": "9e0f1a2b-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
  "model": "meta:muse@image",
  "positivePrompt": "A horizontal bar chart for a SaaS product report, titled \"Feature adoption, 90 days after launch\". Six bars with the labels and values \"Shared inbox 78%\", \"Automations 64%\", \"Custom fields 51%\", \"Time tracking 37%\", \"Public API 22%\" and \"Mobile offline 14%\", each percentage printed at the end of its bar. X axis running 0 to 100% with light gridlines every 20%. Indigo bars on a white background, thin grey axis line, clean sans-serif typography, flat vector chart style, generous margins.",
  "width": 1920,
  "height": 1280,
  "settings": {
    "shell": true,
    "webSearch": false
  }
}
```

Response

```json
[
  {
    "taskType": "imageInference",
    "taskUUID": "9e0f1a2b-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
    "imageUUID": "2b3c4d5e-6f70-4a81-9b2c-3d4e5f607182",
    "imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/2b3c4d5e-6f70-4a81-9b2c-3d4e5f607182.jpg"
  }
]
```

Muse Image has no `seed` parameter, so **the same prompt gives you a different layout each time** and a value that rendered cleanly on one pass can sit awkwardly on the next. Picking the cleanest of four renders is cheaper than another round of prompt edits. The non-determinism itself is covered in [prompting](https://runware.ai/docs/models/meta-muse-image/guides/prompting).

### [Tables and spec grids](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#tables-and-spec-grids)

A table is a geometry problem before it is a typography problem. The code tool **lays the grid out** so cells stay aligned all the way to the last row, which is the first thing a drawn table loses.

![A three-column pricing comparison table headed Compare plans, with Starter, Growth and Scale columns priced at $19, $39 and $79 per user per month, a Most popular badge above the Growth column, and seven feature rows covering seats, projects, automations, single sign-on, audit log, API rate limit and support](https://runware.ai/docs/assets/output-plan-table.Cz_hj1Xx_ZqUYsn.jpg)

> **Prompt**: A pricing comparison table titled "Compare plans" for a SaaS product. Three plan columns headed "Starter $19 per user per month", "Growth $39 per user per month" and "Scale $79 per user per month", with a small "Most popular" badge above the Growth column. Seven feature rows down the left side: "Seats included" 3 / 25 / Unlimited, "Projects" 10 / 200 / Unlimited, "Automations per month" 500 / 5,000 / 50,000, "Single sign-on" dash / dash / tick, "Audit log" dash / tick / tick, "API rate limit" 60 rpm / 600 rpm / 6,000 rpm, "Support" Email / Email and chat / Dedicated manager. Navy header row, alternating pale grey row stripes, centred cell values, aligned columns, white background, clean sans-serif typography, flat vector interface style.

The prompt walks the table the way you would read it: the three column headers first, then each feature row as one clause carrying its own three cells. **Write the cells row by row** and every value stays attached to both its row and its column. Dumping all twenty-one cells as one flat list is how a Scale-tier number ends up in the Starter column.

Prices need the same treatment. **Pair a price with the thing it belongs to** in the same breath, so "Growth $39 per user per month" travels as one unit. A separate price list under a separate plan list gets shuffled, and a pricing table with the wrong number in it is worse than no table.

Cell ticks and a highlighted column are ordinary prompt content, so **name the badge and the column it sits over** and it lands there. How the type itself is set, from string length to hierarchy on the page, is [text in images](https://runware.ai/docs/models/meta-muse-image/guides/text-in-images).

### [QR codes that scan](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#qr-codes-that-scan)

A QR code is the clearest case for the code tool, because **a drawn one never scans** however convincing the pattern looks. The model generates the matrix in code and places the result into the layout, so the printed code resolves to the URL you gave it rather than to something that only resembles one.

![A vertical off-white webinar poster with a Fieldbase wordmark top left, a bold navy headline reading Automate your release notes over a wide amber diagonal band, a subhead giving the workshop date and time, and a black QR code on a white square in the lower third above the caption Scan to register](https://runware.ai/docs/assets/output-qr-poster.Bk5rFBhM_NmqxY.jpg)

*The code on this poster is a working one, built by the code tool, and it resolves to https://runware.ai*

> **Prompt**: A vertical event poster for a developer webinar. Large bold navy headline "Automate your release notes" across the top third, a subhead reading "Live workshop, Thursday 14 May, 3pm CET", and a small "Fieldbase" wordmark in the top left corner. In the lower third, a functional QR code encoding the URL https://runware.ai printed in solid black on a white square with a wide clear margin around it, and the caption "Scan to register" directly beneath it. Off-white background, a wide amber diagonal band behind the headline, generous white space, flat vector poster design, crisp sans-serif typography.

Point a phone at the poster above and it opens `https://runware.ai`. Four things keep a generated code in that state.

- **Encode a plain URL.** A short `https://` address produces a low-density matrix whose modules survive being rendered into a design. Long tracking URLs push the density up until the modules are too small to hold.
- **Ask for a quiet zone.** Solid black on a white square with a clear margin around it. Scanners read the margin, and a code that bleeds into the artwork behind it fails.
- **Leave the modules alone.** Gradients across the code, rounded module art, a low-contrast colour pair, and a logo dropped into the middle are where scannability goes. Style the poster around the code instead.
- **Scan the render before it ships.** There is no seed, so a re-run produces a new poster with a newly built code, and each one needs the same check.

> [!WARNING]
> Put the URL in the prompt exactly as it should be encoded, with the scheme included. "A QR code linking to our signup page" gives the model nothing to encode, and what comes back is a pattern rather than a code.

### [Multi-panel explainers](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#multi-panel-explainers)

A how-to graphic is **a structured layout with repeated geometry**: equal panels and the same internal arrangement inside every one of them. That repetition is the part that falls apart when a model composes the sheet freehand, and it is the part the code path holds together.

![A wide four-panel strip on a white background divided by thin rules, each panel holding a flat navy and teal illustration above a numbered step title and one line of copy, running from Connect a source through Map your fields and Build a board to Share and alert](https://runware.ai/docs/assets/output-onboarding-panels.AU5K4R2S_Nk2XP.jpg)

> **Prompt**: A four-panel onboarding explainer laid out as one wide strip of equal panels divided by thin grey rules, for a SaaS analytics app. Each panel holds a flat illustration above a large step number, a short bold title and one line of body copy. Panel 1 "1. Connect a source" with "Link your warehouse or upload a CSV." over an illustration of a database cylinder joined to a cloud. Panel 2 "2. Map your fields" with "Match columns to metrics once, reuse them forever." over an illustration of two lists joined by arrows. Panel 3 "3. Build a board" with "Drag charts onto a shared canvas." over an illustration of a dashboard holding three chart tiles. Panel 4 "4. Share and alert" with "Send a weekly digest to your team." over an illustration of an envelope with a small bell badge. White background, navy and teal palette with one coral accent, identical panel structure across all four, clean sans-serif typography, flat vector illustration style.

The prompt fixes the panel count up front, then walks the panels in order and gives each one its number, its title, its illustration, and its line of copy. **Number the steps inside the copy itself** so the reading order survives even when the geometry shifts, and say "identical panel structure" explicitly rather than trusting the model to infer it from four similar descriptions.

**Composition still reflows between runs** even when the content is right. Panels come back at slightly different widths, or an illustration swaps places with its title. **Keep each panel's copy to one short line** so a reflow has nothing to overflow, and re-run rather than piling on more layout adjectives. When a single panel is wrong and the rest of the strip is good, a scoped change fixes that panel without rebuilding the sheet, which is [editing images](https://runware.ai/docs/models/meta-muse-image/guides/editing-images).

### [When to switch the shell off](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#when-to-switch-the-shell-off)

`settings.shell: false` takes the code path away and the model draws the graphic instead. For a figure with **no data to preserve**, that is the output you want. An editorial chart on a blog header is a gesture meaning "up and to the right", not a series, and a drawn line is looser and better looking than a plotted one.

![A square social graphic on a deep indigo to violet gradient showing a glowing stylised line climbing from lower left to upper right over a faint dotted grid, with the headline How we cut onboarding time in half set in bold white type across the lower half](https://runware.ai/docs/assets/output-editorial-card.Djvtxfnv_Z1gEELB.jpg)

*No axis and no values, so nothing for the code tool to compute*

> **Prompt**: A square social graphic for a product engineering blog post. A stylised illustrated line climbing from the lower left to the upper right across a deep indigo to violet gradient, with a faint dotted grid behind it and a soft glow along the line. No axis, no gridline labels and no numbers. The headline "How we cut onboarding time in half" set in bold white type across the lower half. Flat editorial illustration style, generous margins.

That card has no values in it, so there is nothing for the code tool to compute and nothing for a reader to verify. Switching the shell off **takes the tool call out of the run** and leaves the model free to treat the line as artwork. The same call applies to hand-drawn diagram styles and to any graphic where a plotted figure would read as too rigid for the page.

Everywhere else, leave it on. The default is **permission rather than a requirement**, so the model reaches for the tool when the layout calls for it and leaves it alone when it does not.

### [Tips](https://runware.ai/docs/models/meta-muse-image/guides/infographics-and-charts#tips)

1. **Put every number in the prompt.** The code tool renders the series you supply and does not reconstruct one you left out. A chart prompt with a title but no values gets you a plausible-looking invention.
    
2. **Pair each value with its label.** "Custom fields 51%" survives the trip. Six labels followed by six loose numbers do not, and the mismatch usually lands in the middle of the series.
    
3. **Name the chart form and the axis range.** The form fixes the shape, the range fixes the proportions. Without a stated range, a chart that starts above zero will overstate every gap in the data.
    
4. **Keep printed strings short.** Short labels and one-line panel copy render more reliably than long ones, and they leave the layout room to breathe when the composition reflows.
    
5. **Generate a batch and pick.** With no seed, three or four renders of the same prompt give you a real choice instead of a single roll.
    
6. **Scan every QR code before it ships.** Each render builds a fresh code. Encode a short plain URL and keep every art treatment off the modules.
    
7. **Only switch the shell off for figures with no data.** Editorial and illustrative graphics gain from the drawn look. Anything a reader might check a number against keeps the default.