2026-10-24

Jupiter's "analemma" over $12$ years

Introduction

In Oct-2026, a discussion on Reddit spurred me to think about what it would mean for a planet to have an Analemma. I shared my thoughts on 20-Oct-2026. The relevant portion of that response is reproduced verbatim below.

...

For a planetary analemma (if one can call it that), things are a little complicated. You need to capture the direction vector to the planet at a period that equals the mean duration between two successive transits across the meridian by the planet. ... 

For the outer planets (Mars onwards), to a first approximation, you can imagine that the planet is going around the Earth in an approximately elliptical orbit. This would give you a very similar analemma curve as the Sun or Moon - except that it will only be a piece of the curve and will not be a closed loop as the planet will NOT return to its original position at the end of a year. Further, there will be a retrograde loop superimposed on this main curve. How this would look like would depend on the relative positions of the planet and the Earth in their orbits.

(The inner planets are going to be even more complicated.)

But, in theory, you could take a tool like Stellarium and take screenshots periodically (i.e., at a period that matches the mean duration between two successive meridian transits for the planet you're interested in). Then overlay all those screenshots on top of each other so that the meridian is aligned in all the shots. ...

...

I eventually followed up on my thought process above by taking screenshots on Stellarium periodically (at $7\times$ the mean meridian transit period for Jupiter) covering a span of $12$ years as that subsumes Jupiter's orbital period of $11.86$ years. The screenshot sequence was then converted into a movie. I shared the movie on 22-Oct-2026.

The rest of this post details the mechanics of how I did it.

Below I've included some corrections. One of them was to the calculation of Jupiter's mean meridian transit period; the correct value being $0.997499163159787$ days while I had used $0.997499738798944$ days. Thus, the video shared on Reddit is not ideal, but it's hard to tell the difference as the error is under $50$ ms/day and accumulates to $\approx 218$ sec over $12$ years.

Jupiter's mean meridian transit period

The mean meridian transit period for Jupiter is calculated as follows
  • Earth's sidereal day: $23.9344694444444$ hrs ($23$h $56$m $4.09$s)
    • Earth's sidereal angular rate: $15.0410687329257$ deg/hr
  • Jupiter orbital period: $4332.59$ days
    • Jupiter (mean) sidereal angular rate: $360/4332.59$ $=$ $0.0830911764094918$ deg/day = $0.00346213235039549$ deg/hr
If $T$ hrs is the mean time between successive meridian transits of Jupiter then $$15.0410687329257\ T = 360 + 0.00346213235039549\ T$$ Solving for $T$ gives $T = 0.997499163159787$ days.

Stellarium script

If I took screenshots every $7 \times 0.997499163159787$ $=$ $6.98249414211851$ days, then I would need $\approx 621$ screenshots to cover $11.86$ years (Jupiter's orbital period). This would be tedious to do manually. Hence, I captured screenshots via a Stellarium script which is reproduced below. I generated screenshots to span $12$ years.


var startJD = 2461041.5; // 2026-JAN-01 00:00:00
var stepDays = 6.98249414211851; // 7x Jupiter meridian transit periods
var count = 628; // Covers 12 years

var outputDir = "/home/\$USER/Pictures/Stellarium/";

core.setTimeRate(0); // Freeze simulation time between explicit date changes.

var jd = startJD;

for (var i = 0; i < count; i++) {
    core.setJDay(jd); // Set the simulation date.

    core.wait(0.5); // Wait for display refresh

    var fname_prefix = "frame_JD" + jd.toFixed(8);     core.screenshot(fname_prefix, false, outputDir, true, "png"); // Overwrite enabled

    core.wait(0.5); // short gap between captures.

    jd += stepDays;
}

Converting to a movie

The screenshots were converted into an mpeg file using ffmpeg and the command line below.

ffmpeg -framerate 8 -pattern_type glob -i 'frame_JD*.png' -c:v libx264 -crf 18 -pix_fmt yuv420p jupiter.mp4

The framerate of $8$ implies that each second in the video corresponds to $8 \times$ $6.98249414211851$ $\approx$ $55.86$ calendar days.

The (updated) video using the correct $T$ has been uploaded to YouTube (embedded link below). The time shown at the bottom is also in UTC instead of Central Daylight Time that was used for the video shared on Reddit.

Manually select the High-Defintion (1080p) quality if YouTube serves up a lower quality version.


I manually traced out the "analemma" curve for Jupiter and overlaid it on the first image. The path is basically a Lissajous curve and reflects the retrograde motion every year riding on top of a $11.86$ year cycle that moves it up and down. (Since the curve was manually traced based on Jupiter's positions in the screenshots, there are quite literally some rough edges in there.)

Jupiter's "analemma" over $12$ years

No comments: