Plotting by attribute
Set where each element sits from a value it already carries. The dual of sampling.
Fields & sampling reads a value out of space and writes it onto an element. The Plot node runs the other way: it reads a value off the element and turns it into a position. Colour becomes a layout, an id becomes a rank, a group value becomes a cluster.
Plot sets an absolute position rather than an offset, and it never adds or removes elements. Whatever came in comes out, somewhere else.
Project bound attributes onto Cartesian, Polar, Cylindrical, or Spherical axes to set absolute position. The dual of Sample.
Binding an attribute to an axis
There are three axes, named A, B and C rather than X, Y and Z, because what each one means depends on coordinate_system.
| System | Axis A | Axis B | Axis C |
|---|---|---|---|
| Cartesian | X | Y | Z |
| Polar | Azimuth | Radius | not read |
| Cylindrical | Azimuth | Radius | Height |
| Spherical | Azimuth | Polar angle | Radius |
Name an attribute in axis_a_attr and each element's value for it becomes that element's position along A. A single component works as well as the whole attribute, so P.x and Cd.r are legal names and are how a colour solid is built: bind Cd.r, Cd.g and Cd.b to the three axes and the cloud arranges itself into the shape of its own gamut.
Each axis has its own domain. Auto fits the axis to the attribute's real minimum and maximum across every element, recomputed as the data changes, with no separate node to find the range first. Manual takes a fixed [min, max], which is what you want when the range must not shift under you. Normalized assumes the values already sit between 0 and 1.
scale sizes the result. The projection itself is unit-sized, so scale is the whole plot's size in world units.
An axis you do not bind
Leaving an axis empty is not an error, and it is how a plot collapses to fewer dimensions. The axis falls to its own neutral value, which depends on what that axis does: a centred axis lands in the middle, and a radius or an angle falls to zero.
That has one sharp edge worth knowing before it catches you.
Under Polar, axis C is not read at all, but it is still on the node and still bindable. Bind only axis C and A and B fall to their neutrals, which for an azimuth and a radius are both zero, so every element lands on the origin at once. Plot takes over the visual, so the viewport goes blank rather than showing the input. Bind A and B under Polar; use Cylindrical or Spherical if you need a third.
There is a second case where an axis has nothing to work with: every element carrying the same value. An Auto or Manual axis cannot fit a range to a single value, so the axis is pinned to the low end of its range instead of dividing by zero. Under Cartesian that is the minimum edge, not the centre.
Plotting part of a collection
mask names a selection weight attribute, the same one a Select node writes. Left empty, the whole input is projected. Named, only the selected elements move, and a soft weight moves an element part of the way to its plotted position, so a falloff gives a partial plot you can animate from nothing to fully sorted.
Naming an attribute the input does not carry moves nothing at all, rather than moving everything.
Two inputs behave differently from points. A Gaussian splat cloud reports no attributes for masking, so a mask on splats can never fire and the whole cloud plots. An analytic shape has no per-element position column for the kernel to read, so a path collapses to a single dot; convert it to points first.
| Parameter | Type | Default | What it does |
|---|---|---|---|
input | Collection | — | Points, Geometry, or Collection to reposition by projecting attributes onto the coordinate axes. |
mask | String | "" | Selection weight attribute restricting which elements are projected (from Select). Empty = whole collection; soft weights plot part-way. |
coordinate_system | String | "Cartesian" | How Axis A/B/C are interpreted. Cartesian: X/Y/Z. Polar: Azimuth/Radius. Cylindrical: Azimuth/Radius/Height. Spherical: Azimuth/Polar-angle/Radius. One of: Cartesian, Polar, Cylindrical, Spherical. |
axis_a_attr | String | "" | Attribute driving Axis A. Meaning by coordinate system: Cartesian = X; Polar/Cylindrical/Spherical = Azimuth. |
axis_a_domain | String | "Auto" | Axis A domain. Auto: fit attribute range. Manual: use [min, max]. Normalized: attribute already 0-1. One of: Auto, Manual, Normalized. |
axis_a_domain_range | Vec2 | (0, 1) | Manual domain [min, max] for Axis A. Values in this range map across the axis. |
axis_b_attr | String | "" | Attribute driving Axis B. Meaning by coordinate system: Cartesian = Y; Polar/Cylindrical = Radius; Spherical = Polar angle. |
axis_b_domain | String | "Auto" | Axis B domain. Auto: fit attribute range. Manual: use [min, max]. Normalized: attribute already 0-1. One of: Auto, Manual, Normalized. |
axis_b_domain_range | Vec2 | (0, 1) | Manual domain [min, max] for Axis B. Values in this range map across the axis. |
axis_c_attr | String | "" | Attribute driving Axis C. Meaning by coordinate system: Cartesian = Z; Cylindrical = Height; Spherical = Radius; Polar = unused. |
axis_c_domain | String | "Auto" | Axis C domain. Auto: fit attribute range. Manual: use [min, max]. Normalized: attribute already 0-1. One of: Auto, Manual, Normalized. |
axis_c_domain_range | Vec2 | (0, 1) | Manual domain [min, max] for Axis C. Values in this range map across the axis. |
scale | Number | 1 | Overall size of the plot in world units. The projection is unit-sized; this scales it up. |
strength | Number | 1 | Effect strength / wet-dry (0 = no effect, 1 = full). Editable, wirable, keyframable. |
A field is a valid input
Wiring a field straight into Plot works, because a field converts to points on the way in: the field is sampled over a grid and each sample becomes an element carrying the sampled value. A colour field arriving that way carries Cd, so binding Cd.r, Cd.g and Cd.b to a Spherical plot turns a procedural texture into a solid you can turn around and look at.