Wiggle One Axis

Classic wiggle locked to a single axis — the other axis stays exactly where you put it.

Expression Code
// Wiggle One Axis
// Apply to Position
freq = 2; // Wiggles per second
amp = 30; // Wiggle amount in pixels
axis = 0; // 0 = wiggle X only, 1 = wiggle Y only
seedRandom(index, true);
w = wiggle(freq, amp);
if (value.length == 3) {
if (axis == 0) {
[w[0], value[1], value[2]];
} else {
[value[0], w[1], value[2]];
}
} else {
if (axis == 0) {
[w[0], value[1]];
} else {
[value[0], w[1]];
}
}
Apply to Position with Separate Dimensions turned OFF (if Position shows as separate X/Y properties, right-click it and untick Separate Dimensions — the expression errors on the split 1-D properties). Then choose the axis: 0 wiggles horizontally only, 1 vertically only. The wiggle is computed for both axes but only one is used — the other returns the untouched value, so Position keyframes on that axis still play back exactly. Duplicated layers wiggle differently thanks to the index-based seed. 3D layers work automatically — Z is passed through untouched.
Back to Wiggle & Noise