XYAny
The transparent XY plot engine people actually reach for
- X
- Y
- Z
- X_Labels
- Y_Labels
- Z_Labels
- X Values
- X Labels
- Y Values
- Y Labels
- Z Values
- Z Labels
- Total Images
- Split Every
XYAny is the node that makes the pack worth installing. Feed it two lists - say, three checkpoints and five seeds - and it generates the Cartesian product as separate, labeled value lists that you fan out across your sampler. When the batch comes back, XYImage (its partner in crime) reassembles the results into a grid. That two-node combo is the "XY plot" people are actually running when they say ComfyUI does grid sweeps, and it's the reason the pack keeps getting recommended in threads about testing Flux LoRAs and checkpoints.
Here's what it does, concretely. You feed X and Y - any two lists. It computes every combination, then unzips them back into two lists of equal length: X Values has the X value for each combination, Y Values has the matching Y value. If X has 3 items and Y has 5, both outputs come out 15 items long, in lockstep, so the sampler runs 15 generations where X drives one axis and Y the other. That's the "transparent" part people like: you can see exactly what value goes with what, which is precisely what the opaque XY nodes in other packs hide from you.
The rest of the outputs exist to keep your grid readable. X Labels and Y Labels are the strings that XYImage will draw on each axis. If you don't supply labels via X_Labels / Y_Labels, the node falls back: str() mode labels each value with its own text, and Numbers mode labels with indexes (0, 1, 2…). Labels are only as good as your lists - if you hand in labels whose length doesn't match the values, the mismatch will surface downstream in XYImage, which enforces the counts.
There's also an optional third axis. Connect Z (another list) and the node expands the product: X and Y get tiled once per Z value, and Z repeats per group. Total Images tells you the final count (len(X) × len(Y) × len(Z)), and Split Every gives you len(Y) - the slice size the grid assembler needs to break the flat batch back into rows. That's your numbers check before you burn GPU time: if Total Images isn't what you expected, fix the lists now.
The community's usage pattern is consistent: people pair it with the pack's Range nodes for the numeric axis and String List / String List From Newline for the text axis, then run checkpoint × seed or LoRA × CFG sweeps. It shows up in the exact threads you'd hope - "Is there a ComfyUI node to do XYZ plot for Flux that supports LoRAs?" gets answered with "personally I use KepListStuff's XY nodes."
Install is light - no pip deps beyond what ComfyUI ships:
cd ComfyUI/custom_nodes
git clone https://github.com/M1kep/Comfy_KepListStuff
Restart ComfyUI, or search Comfy_KepListStuff in Manager. Find XYAny under List Stuff, and bring XYImage along - the plot isn't complete without it.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| X | * | — | |
| Y | * | — | |
| X_Label_Fallback | COMBO | str() | 2 options: str(), Numbers |
| Y_Label_Fallback | COMBO | str() | 2 options: str(), Numbers |
| Z_Label_Fallback | COMBO | str() | 2 options: str(), Numbers |
| Zopt | * | — | |
| X_Labelsopt | * | — | |
| Y_Labelsopt | * | — | |
| Z_Labelsopt | * | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| X Values | * | — |
| X Labels | STRING | — |
| Y Values | * | — |
| Y Labels | STRING | — |
| Z Values | * | — |
| Z Labels | STRING | — |
| Total Images | INT | — |
| Split Every | INT | — |