ComfyUI Node

XY Plot Modifier

XY Plot Modifier Is a Label Plus a Diff

By kinorax·Created 5 months ago·Updated about a month ago· 2
XY Plot Modifier
  • modifiers
  • model
  • refiner
  • detailer
  • lora_stack
  • clip
  • size
  • extras
  • modifiers
vae
positive
negative
steps
sampler
scheduler
cfg
seed
label

If you've ever built a comparison grid by hand - duplicate the sampler six times, change the LoRA strength, paste the results together - you know the pain this node exists to remove. In the automatic1111 world, XY plot was a checkbox on the script menu. In ComfyUI, grids have always been a DIY project. The Info-Prompt-Toolkit pack's answer is three nodes - Start, Modifier, End - and the Modifier is the one that actually defines what varies.

Think of it as a diff over your base settings. You hand it one change and one label; it doesn't care about the full workflow, because the workflow's baseline lives in the image_info bundle that XY Plot Start supplies. Modifier just says "when you get to my cell, swap these specific values."

What it changes

Every optional input on this node is a field it can override. The ones you'll actually use:

  • model, refiner, detailer - swap which model is in play. The classic "same prompt, four checkpoints" grid.
  • lora_stack - the LoRA rotation grid: same base model, N LoRAs (or N strengths).
  • positive / negative - prompt variation. The "one token changed across 16 images" grid that people keep asking how to build.
  • steps, cfg, sampler, scheduler, seed - sampler-grids. Note sampler/scheduler come in as plain strings here; the pack's Sampler Selector and Scheduler Selector nodes exist precisely to feed them.
  • size and extras - resolution or metadata variations.
  • label - the axis label. Leave it empty and the pack auto-labels from what changed; set it when you want "LoRA: flat" instead of an auto-derived string.

You don't set all of these. You set the one (or two) that your grid's axis is testing. That restraint is the whole design.

Chaining is the mechanism

The one output is modifiers, and it's an array - which is how you build a multi-point axis. Wire the first Modifier's output into the next Modifier's modifiers input, and each one appends its {label, changes} pair to the chain. A chain of five Modifiers = five cells on that axis. The README calls it an "axis-specific change set" array, and that's exactly right.

From there the chain plugs into either x_modifiers or y_modifiers on XY Plot Start. X-chain, Y-chain, and Start does the cross-product. One axis of Modifiers is a row; two axes is the grid.

Installing it

It ships in ComfyUI-Info-Prompt-Toolkit:

cd ComfyUI/custom_nodes
git clone https://github.com/kinorax/comfyui-info-prompt-toolkit.git
cd comfyui-info-prompt-toolkit
pip install -r requirements.txt

or install via ComfyUI Manager by searching the pack title, then restart ComfyUI. No model downloads for the XY nodes - the only prerequisites are your existing models and a recent ComfyUI (≥ 0.17.0), since this pack targets the newer node API.

The trap to dodge

People new to the trio tend to wire Modifier chains into each other and wonder why the grid is tiny. Remember: Modifiers never touch a base image_info - they only describe changes. The actual per-cell image_info construction happens in XY Plot Start. If your cells all look identical, the usual cause is the change you intended (say, a LoRA or prompt) isn't actually connected to a Modifier input - the node happily produces a "no-op" modifier with an empty diff. Chain, then Start, then End, and verify the chain actually carries a change before you burn a batch on it.

CategoryInfo-Prompt-Toolkit/XYPlot

Inputs (17)

NameTypeDefaultDescription
modifiersoptIPT-XYPlotModifierModifier array chain input
modeloptIPT-Model
refineroptIPT-Model
detaileroptIPT-Model
lora_stackoptIPT-LoraStack
clipoptIPT-Clip
vaeoptSTRING
positiveoptSTRING
negativeoptSTRING
stepsoptINT0–100000
sampleroptSTRING
scheduleroptSTRING
cfgoptFLOAT
seedoptINT-9223372036854776000–9223372036854776000
sizeoptIPT-Size
extrasoptIPT-ImageInfoExtras
labeloptSTRINGOptional axis label. Leave empty for auto label.

Outputs (1)

NameTypeDescription
modifiersIPT-XYPlotModifier