D2 XY Plot Easy
The one-node XY plot that finally makes parameter grids painless
- reset
- index
- remaining_time
- xy_seed
- progress_bar
- d2_pipe
- grid_pipe
- positive
- negative
- ckpt_name
- ckpt_type
- seed
- steps
- cfg
- sampler_name
- scheduler
- denoise
- x_other
- y_other
- x_annotation
- y_annotation
- status
- index
If you've ever tried to test "which of these 12 checkpoints, at 3 CFGs, gives me the look I want," you know the pain: 36 runs, a pile of untracked images, and a spreadsheet. D2 XY Plot Easy collapses the whole thing into one node. It's the sampler-parameter XY plot for people who don't want to build a multi-node plot rig - you pick what varies on X and Y, type your lists, hit queue, and the node runs the whole grid and hands a complete comparison to D2 XY Grid Image.
How it works
It's a KSampler config plus an XY runner fused together. You set the base generation parameters (prompt, negative, checkpoint, seed, steps, cfg, sampler, scheduler, denoise) directly on the node, then choose what the X and Y axes vary via x_type / y_type. The axis options are the sampler's own knobs - positive, negative, ckpt_name, seed, steps, cfg, sampler_name, scheduler, denoise - plus STRING, INT, and FLOAT for feeding arbitrary values through the x_other / y_other outputs. ckpt_type picks whether ckpt_name (a checkpoint file) or unet_name (a diffusion model) is the one being plotted.
Each queue execution pulls one cell of the grid: row = X value, column = Y value. With auto_queue on (default), it queues the exact number of runs needed automatically - you press queue once and walk away. start_index lets you resume from a specific cell, and the Reset button zeroes the internal index when you stop midway and want to start over.
The outputs you'll use
The node emits a lot, but the wiring is simple:
d2_pipe- one wire into D2 KSampler. Carries the current cell's parameters.grid_pipe- one wire into D2 XY Grid Image. Carries the axis annotations and the status signal that tells the grid when to assemble.- The individual
positive,negative,seed,steps,cfg, etc. - pass-throughs if you want the values elsewhere. x_other/y_other- where the STRING/INT/FLOAT axis values come out. Wire these into whatever input they vary.x_annotation/y_annotation/status/index- mostly for advanced plumbing; the grid node gets them viagrid_pipe.
For prompt comparisons specifically: set x_type to positive, and the node treats the first line of x_list as the search text that every subsequent line replaces in the base prompt. So put a placeholder on line one, then your variants:
__hair__
blonde hair,
black hair,
With a base prompt containing __hair__, you get one row per variant (the first row is the unchanged baseline). Same logic works with x_type: negative. If you'd rather swap entire prompt blocks, use x_type: STRING and route x_other into a D2 KSampler's positive instead.
Installing
Part of D2 Nodes ComfyUI:
cd ComfyUI/custom_nodes
git clone https://github.com/da2el-ai/D2-nodes-ComfyUI
or search "D2 Nodes ComfyUI" in ComfyUI Manager. No model downloads.
The gotchas
- The pipe overrides the widgets. If you feed this node's output into a KSampler whose widgets show different values, the pipe wins. That's by design.
- Reset before re-running. Stop a grid midway and the internal index keeps counting. Hit Reset (or raise
start_index) or your second run starts at the wrong cell. auto_queueoff means manual. With it off, nothing auto-queues - you press queue per cell. That's occasionally useful for selective runs, but forgetting it is how people think the node is broken.
If you want full generality - plotting LoRA strengths, model merges, arbitrary conditioning - the plain D2 XY Plot is the bigger hammer. But for "test sampler settings / prompts / steps / CFG," D2 XY Plot Easy is the one you'll reach for, because it's the only plot in the pack that doesn't require you to build the plumbing yourself.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | STRING | — | |
| negative | STRING | — | |
| ckpt_name | COMBO | 0 options: | |
| unet_name | COMBO | 0 options: | |
| ckpt_type | COMBO | 2 options: stable_diffusion, diffusion | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 7.000–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| denoise | FLOAT | 1.000–1 | — |
| x_type | COMBO | 13 options: none, positive, negative, ckpt_name, seed, steps, +7 | |
| x_list | STRING | — | |
| y_type | COMBO | 13 options: none, positive, negative, ckpt_name, seed, steps, +7 | |
| y_list | STRING | — | |
| auto_queue | BOOLEAN | true | — |
| start_index | INT | 0 | — |
| resetopt | D2_BUTTON | — | |
| indexopt | D2_XYPLOT_INDEX | — | |
| remaining_timeopt | D2_TIME | — | |
| xy_seedopt | D2_SEED | — | |
| progress_baropt | D2_PROGRESS_BAR | — |
Outputs (18)
| Name | Type | Description |
|---|---|---|
| d2_pipe | D2_TD2Pipe | — |
| grid_pipe | D2_TGridPipe | — |
| positive | STRING | — |
| negative | STRING | — |
| ckpt_name | * | — |
| ckpt_type | STRING | — |
| seed | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler_name | * | — |
| scheduler | * | — |
| denoise | FLOAT | — |
| x_other | * | — |
| y_other | * | — |
| x_annotation | D2_TAnnotation | — |
| y_annotation | D2_TAnnotation | — |
| status | STRING | — |
| index | INT | — |