Quickstart¶
Let's imagine you're impatient, and all you want to do is make a pretty movie or two. Here's a good place to start. Odds are, you have a collection of .fits
files somewhere, and you'd like to display them as a movie. To simulate your situation, let's make a directory full of files.
from illumination.cartoons import create_directory_of_fits
create_directory_of_fits('some-directory')
If we look in the some-directory
directory, we see it contains four directories, each of which contain some images.
!ls some-directory/*
some-directory/cam1: cam1-0000.fits cam1-0002.fits cam1-0004.fits cam1-0006.fits cam1-0008.fits cam1-0001.fits cam1-0003.fits cam1-0005.fits cam1-0007.fits cam1-0009.fits some-directory/cam2: cam2-0000.fits cam2-0002.fits cam2-0004.fits cam2-0006.fits cam2-0008.fits cam2-0001.fits cam2-0003.fits cam2-0005.fits cam2-0007.fits cam2-0009.fits some-directory/cam3: cam3-0000.fits cam3-0002.fits cam3-0004.fits cam3-0006.fits cam3-0008.fits cam3-0001.fits cam3-0003.fits cam3-0005.fits cam3-0007.fits cam3-0009.fits some-directory/cam4: cam4-0000.fits cam4-0002.fits cam4-0004.fits cam4-0006.fits cam4-0008.fits cam4-0001.fits cam4-0003.fits cam4-0005.fits cam4-0007.fits cam4-0009.fits
Basic Animations¶
Now, starting with these FITS, we can use the following commands to visualize those images.
from illumination import illustratefits, glob
i = illustratefits('some-directory/cam1/*.fits')
i.animate('a-snazzy-little-movie.mp4')
[fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam1/cam1-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] yo! [cameraframe] plotting <F"camera"> for the first time [cameraframe] {} [cameraillustration] {} [cameraillustration] included <F"camera"> in the shared color scheme [cameraillustration] defined color scheme with cmap=Blues norm=<matplotlib.colors.LogNorm object at 0x17c726240> ticks=[31.776880269455766, 68.13340831450066, 146.08612579921999] [cameraframe] added image of shape (100, 100) to <F"camera"> [cameraframe] making sure a shared colorbar is set up for <F"camera"> [cameraframe] added a shared colorbar for <I"CameraIllustration"> [cameraillustration] adding a new colorbar for 1 frame(s) [cameraframe] added time label of "#0" on <F"camera"> [cameraframe] added arrows on <F"camera"> [cameraframe] added title of "" to <F"camera"> [cameraillustration] about to animate 11 times at 1.0s cadence for <I"CameraIllustration"> [cameraillustration] 30 frames/second : [cameraillustration] the animation will be saved to a-snazzy-little-movie.mp4 [cameraillustration] 1/11 at 2024-09-12 20:25:12.361
[cameraillustration] 2/11 at 2024-09-12 20:25:12.479 [cameraillustration] 3/11 at 2024-09-12 20:25:12.494
[cameraillustration] 4/11 at 2024-09-12 20:25:12.509 [cameraillustration] 5/11 at 2024-09-12 20:25:12.523 [cameraillustration] 6/11 at 2024-09-12 20:25:12.537 [cameraillustration] 7/11 at 2024-09-12 20:25:12.551 [cameraillustration] 8/11 at 2024-09-12 20:25:12.564 [cameraillustration] 9/11 at 2024-09-12 20:25:12.631 [cameraillustration] 10/11 at 2024-09-12 20:25:12.664 [cameraillustration] 11/11 at 2024-09-12 20:25:12.679
[cameraillustration] [cameraillustration] the animation is finished!
Neat! That makes us a little animation!
The illustratefits
function will make an animation out of all the files that matches the file pattern (with glob
). It will try to find times inside the headers of those images, but if it doesn't, it will simply order images by filename.
If you want, you can explicitly create a list of files to include. For example, you could feed in the same files, but in reverse, as follows.
files = glob.glob('some-directory/cam1/*.fits')[::-1]
i = illustratefits(files, title="now it's backwards!")
i.animate('backwards-snazzy-little-movie.mp4', fps=3, dpi=200)
[fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam1/cam1-0005.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] yo! [cameraframe] plotting <F"camera"> for the first time [cameraframe] {} [cameraillustration] {} [cameraillustration] included <F"camera"> in the shared color scheme [cameraillustration] defined color scheme with cmap=Blues norm=<matplotlib.colors.LogNorm object at 0x1760a6c30> ticks=[32.42333121745465, 68.67160393483876, 145.4443146312086] [cameraframe] added image of shape (100, 100) to <F"camera"> [cameraframe] making sure a shared colorbar is set up for <F"camera"> [cameraframe] added a shared colorbar for <I"CameraIllustration"> [cameraillustration] adding a new colorbar for 1 frame(s) [cameraframe] added time label of "#0" on <F"camera">
[cameraframe] added arrows on <F"camera"> [cameraframe] added title of "now it's backwards!" to <F"camera"> [cameraillustration] about to animate 11 times at 1.0s cadence for <I"CameraIllustration"> [cameraillustration] 3 frames/second : [cameraillustration] the animation will be saved to backwards-snazzy-little-movie.mp4 [cameraillustration] 1/11 at 2024-09-12 20:25:12.916 [cameraillustration] 2/11 at 2024-09-12 20:25:13.059
[cameraillustration] 3/11 at 2024-09-12 20:25:13.192 [cameraillustration] 4/11 at 2024-09-12 20:25:13.223 [cameraillustration] 5/11 at 2024-09-12 20:25:13.254 [cameraillustration] 6/11 at 2024-09-12 20:25:13.281 [cameraillustration] 7/11 at 2024-09-12 20:25:13.307 [cameraillustration] 8/11 at 2024-09-12 20:25:13.334 [cameraillustration] 9/11 at 2024-09-12 20:25:13.360 [cameraillustration] 10/11 at 2024-09-12 20:25:13.386
[cameraillustration] 11/11 at 2024-09-12 20:25:13.413 [cameraillustration] [cameraillustration] the animation is finished!
Note that we've also changed a few other things in here too. We added a title
to the illustration, and we changed the frame per second (fps
) and the dots per inch (dpi
) to use when writing the animation.
Animating Multiple Cameras at Once¶
But what if you want to display more than one camera at the same time? The illustratefits
will try to split out different cameras by looking for a string like cam1
or cam2
(etc...) in the FITS filenames. If it doesn't find these, it will revert back to assuming everything is in a single camera.
i = illustratefits('some-directory/cam*/*.fits')
i.animate('a-snazzy-fourcamera-movie.mp4', dpi=50)
[fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam1/cam1-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] [fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam2/cam2-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] [fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam3/cam3-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] [fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam4/cam4-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] yo!
[camera1frame] plotting <F"cam1"> for the first time [camera1frame] {} [fourcameraillustration] {} [fourcameraillustration] included <F"cam1"> in the shared color scheme [fourcameraillustration] included <F"cam2"> in the shared color scheme [fourcameraillustration] included <F"cam3"> in the shared color scheme [fourcameraillustration] included <F"cam4"> in the shared color scheme [fourcameraillustration] defined color scheme with cmap=Blues norm=<matplotlib.colors.LogNorm object at 0x1765ae750> ticks=[31.10065728726663, 67.5765758602871, 146.83270397860085] [camera1frame] added image of shape (100, 100) to <F"cam1"> [camera1frame] making sure a shared colorbar is set up for <F"cam1"> [camera1frame] added a shared colorbar for <I"FourCamera"> [fourcameraillustration] adding a new colorbar for 4 frame(s) [camera1frame] added time label of "#0" on <F"cam1"> [camera1frame] added arrows on <F"cam1"> [camera1frame] added title of "" to <F"cam1"> [camera2frame] plotting <F"cam2"> for the first time [camera2frame] {} [fourcameraillustration] {} [camera2frame] added image of shape (100, 100) to <F"cam2"> [camera2frame] making sure a shared colorbar is set up for <F"cam2"> [camera2frame] added time label of "#0" on <F"cam2"> [camera2frame] added arrows on <F"cam2"> [camera2frame] added title of "" to <F"cam2"> [camera3frame] plotting <F"cam3"> for the first time [camera3frame] {} [fourcameraillustration] {} [camera3frame] added image of shape (100, 100) to <F"cam3"> [camera3frame] making sure a shared colorbar is set up for <F"cam3"> [camera3frame] added time label of "#0" on <F"cam3"> [camera3frame] added arrows on <F"cam3"> [camera3frame] added title of "" to <F"cam3"> [camera4frame] plotting <F"cam4"> for the first time [camera4frame] {} [fourcameraillustration] {} [camera4frame] added image of shape (100, 100) to <F"cam4"> [camera4frame] making sure a shared colorbar is set up for <F"cam4"> [camera4frame] added time label of "#0" on <F"cam4"> [camera4frame] added arrows on <F"cam4"> [camera4frame] added title of "" to <F"cam4"> [fourcameraillustration] about to animate 11 times at 1.0s cadence for <I"FourCamera"> [fourcameraillustration] 30 frames/second : [fourcameraillustration] the animation will be saved to a-snazzy-fourcamera-movie.mp4 [fourcameraillustration] 1/11 at 2024-09-12 20:25:13.719
[fourcameraillustration] 2/11 at 2024-09-12 20:25:13.753 [fourcameraillustration] 3/11 at 2024-09-12 20:25:13.783 [fourcameraillustration] 4/11 at 2024-09-12 20:25:13.812 [fourcameraillustration] 5/11 at 2024-09-12 20:25:13.841
[fourcameraillustration] 6/11 at 2024-09-12 20:25:13.874 [fourcameraillustration] 7/11 at 2024-09-12 20:25:13.906 [fourcameraillustration] 8/11 at 2024-09-12 20:25:13.935
[fourcameraillustration] 9/11 at 2024-09-12 20:25:13.964 [fourcameraillustration] 10/11 at 2024-09-12 20:25:13.994 [fourcameraillustration] 11/11 at 2024-09-12 20:25:14.023 [fourcameraillustration] [fourcameraillustration] the animation is finished!
Magnifying Part of the Frame¶
What if I want to zoom in on a particular region of an image? I can specify the zoom I would like via the zoomposition
and zoomsize
keywords, indicating the (x,y)=(col,row) position of the center of the zoom box, and the
i = illustratefits('some-directory/cam1/*.fits', zoomposition=(30, 50), zoomsize=(42, 14))
i.animate('zoom-movies-are-snazzy-too.mp4', dpi=50)
[fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam1/cam1-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] yo! [cameraframe] plotting <F"camera"> for the first time [cameraframe] {} [singlecamerawithzoomillustration] {} [singlecamerawithzoomillustration] included <F"camera"> in the shared color scheme [singlecamerawithzoomillustration] included <F"zoom"> in the shared color scheme [singlecamerawithzoomillustration] defined color scheme with cmap=Blues norm=<matplotlib.colors.LogNorm object at 0x17667eab0> ticks=[32.164893811189636, 68.50863710086254, 145.91788752571327] [cameraframe] added image of shape (100, 100) to <F"camera"> [cameraframe] making sure a shared colorbar is set up for <F"camera"> [cameraframe] added a shared colorbar for <I"SingleCameraWithZoomIllustration"> [singlecamerawithzoomillustration] adding a new colorbar for 2 frame(s) [cameraframe] added time label of "#0" on <F"camera"> [cameraframe] added arrows on <F"camera"> [cameraframe] added title of "" to <F"camera"> [zoomframe] plotting <F"zoom"> for the first time [zoomframe] {} [singlecamerawithzoomillustration] {} [zoomframe] added image of shape (14, 42) to <F"zoom"> [singlecamerawithzoomillustration] about to animate 11 times at 1.0s cadence for <I"SingleCameraWithZoomIllustration"> [singlecamerawithzoomillustration] 30 frames/second : [singlecamerawithzoomillustration] the animation will be saved to zoom-movies-are-snazzy-too.mp4 [singlecamerawithzoomillustration] 1/11 at 2024-09-12 20:25:14.600
[singlecamerawithzoomillustration] 2/11 at 2024-09-12 20:25:14.658 [singlecamerawithzoomillustration] 3/11 at 2024-09-12 20:25:14.694 [singlecamerawithzoomillustration] 4/11 at 2024-09-12 20:25:14.731 [singlecamerawithzoomillustration] 5/11 at 2024-09-12 20:25:14.766 [singlecamerawithzoomillustration] 6/11 at 2024-09-12 20:25:14.803 [singlecamerawithzoomillustration] 7/11 at 2024-09-12 20:25:14.843
[singlecamerawithzoomillustration] 8/11 at 2024-09-12 20:25:14.876 [singlecamerawithzoomillustration] 9/11 at 2024-09-12 20:25:14.908 [singlecamerawithzoomillustration] 10/11 at 2024-09-12 20:25:14.936 [singlecamerawithzoomillustration] 11/11 at 2024-09-12 20:25:14.960 [singlecamerawithzoomillustration] [singlecamerawithzoomillustration] the animation is finished!
Basic Image Processing¶
Sometimes, you might want to apply some processing to the images before displaying them. Several simple processes are defined via the processingsteps
keyword, which must contain a list (something inside []
) of steps to be applied. The current options are subtractmedian
(subtract the median image), subtractmean
(subtract the mean image), and subtractprevious
(subtract the previous image from the current image). Be careful trying to use subtractmedian
on large datasets -- it requires reading the entire dataset into memory at once.
i = illustratefits('some-directory/cam*/*.fits', processingsteps=['subtractmedian'])
i.animate('median-subtraction-reveals-sazzy-structures.mp4', dpi=50)
[fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam1/cam1-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] [fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam2/cam2-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] [fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam3/cam3-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] [fits-sequence] populating <fits-sequence of 10 images of shape (100, 100)> information from the filenames (like some- directory/cam4/cam4-0000.fits) [fits-sequence] the temporal keys for <fits-sequence of 10 images of shape (100, 100)> are ['filename'] [fits-sequence] the static keys for <fits-sequence of 10 images of shape (100, 100)> are ['camera'] yo! [camera1frame] plotting <F"cam1"> for the first time [fits-sequence] creating a median image for <fits-sequence of 10 images of shape (100, 100)> [fits-sequence] gathering the sequence cube, with shape (10, 100, 100) [fits-sequence] loaded frame 1/10 [fits-sequence] loaded frame 2/10 [fits-sequence] loaded frame 3/10 [fits-sequence] loaded frame 4/10 [fits-sequence] loaded frame 5/10 [fits-sequence] loaded frame 6/10 [fits-sequence] loaded frame 7/10 [fits-sequence] loaded frame 8/10 [fits-sequence] loaded frame 9/10 [fits-sequence] loaded frame 10/10 [camera1frame] {} [fourcameraillustration] {} [fourcameraillustration] included <F"cam1"> in the shared color scheme [fits-sequence] creating a median image for <fits-sequence of 10 images of shape (100, 100)>
[fits-sequence] gathering the sequence cube, with shape (10, 100, 100) [fits-sequence] loaded frame 1/10 [fits-sequence] loaded frame 2/10 [fits-sequence] loaded frame 3/10 [fits-sequence] loaded frame 4/10 [fits-sequence] loaded frame 5/10 [fits-sequence] loaded frame 6/10 [fits-sequence] loaded frame 7/10 [fits-sequence] loaded frame 8/10 [fits-sequence] loaded frame 9/10 [fits-sequence] loaded frame 10/10 [fourcameraillustration] included <F"cam2"> in the shared color scheme [fits-sequence] creating a median image for <fits-sequence of 10 images of shape (100, 100)> [fits-sequence] gathering the sequence cube, with shape (10, 100, 100) [fits-sequence] loaded frame 1/10 [fits-sequence] loaded frame 2/10 [fits-sequence] loaded frame 3/10 [fits-sequence] loaded frame 4/10 [fits-sequence] loaded frame 5/10 [fits-sequence] loaded frame 6/10 [fits-sequence] loaded frame 7/10 [fits-sequence] loaded frame 8/10 [fits-sequence] loaded frame 9/10 [fits-sequence] loaded frame 10/10 [fourcameraillustration] included <F"cam3"> in the shared color scheme [fits-sequence] creating a median image for <fits-sequence of 10 images of shape (100, 100)> [fits-sequence] gathering the sequence cube, with shape (10, 100, 100) [fits-sequence] loaded frame 1/10 [fits-sequence] loaded frame 2/10 [fits-sequence] loaded frame 3/10 [fits-sequence] loaded frame 4/10 [fits-sequence] loaded frame 5/10 [fits-sequence] loaded frame 6/10 [fits-sequence] loaded frame 7/10 [fits-sequence] loaded frame 8/10 [fits-sequence] loaded frame 9/10 [fits-sequence] loaded frame 10/10 [fourcameraillustration] included <F"cam4"> in the shared color scheme [fourcameraillustration] defined color scheme with cmap=RdBu norm=<matplotlib.colors.SymLogNorm object at 0x17c99a600> ticks=[-21.043398283414938, -8.806109481418451, 0, 8.806109481418451, 21.043398283414938] [camera1frame] added image of shape (100, 100) to <F"cam1"> [camera1frame] making sure a shared colorbar is set up for <F"cam1"> [camera1frame] added a shared colorbar for <I"FourCamera"> [fourcameraillustration] adding a new colorbar for 4 frame(s) [camera1frame] added time label of "#0" on <F"cam1"> [camera1frame] added arrows on <F"cam1"> [camera1frame] added title of "" to <F"cam1"> [camera2frame] plotting <F"cam2"> for the first time [camera2frame] {} [fourcameraillustration] {} [camera2frame] added image of shape (100, 100) to <F"cam2"> [camera2frame] making sure a shared colorbar is set up for <F"cam2"> [camera2frame] added time label of "#0" on <F"cam2"> [camera2frame] added arrows on <F"cam2"> [camera2frame] added title of "" to <F"cam2"> [camera3frame] plotting <F"cam3"> for the first time [camera3frame] {} [fourcameraillustration] {} [camera3frame] added image of shape (100, 100) to <F"cam3"> [camera3frame] making sure a shared colorbar is set up for <F"cam3"> [camera3frame] added time label of "#0" on <F"cam3"> [camera3frame] added arrows on <F"cam3"> [camera3frame] added title of "" to <F"cam3"> [camera4frame] plotting <F"cam4"> for the first time [camera4frame] {} [fourcameraillustration] {} [camera4frame] added image of shape (100, 100) to <F"cam4"> [camera4frame] making sure a shared colorbar is set up for <F"cam4"> [camera4frame] added time label of "#0" on <F"cam4"> [camera4frame] added arrows on <F"cam4"> [camera4frame] added title of "" to <F"cam4"> [fourcameraillustration] about to animate 11 times at 1.0s cadence for <I"FourCamera"> [fourcameraillustration] 30 frames/second : [fourcameraillustration] the animation will be saved to median-subtraction-reveals-sazzy- structures.mp4 [fourcameraillustration] 1/11 at 2024-09-12 20:25:15.728 [fourcameraillustration] 2/11 at 2024-09-12 20:25:15.773
[fourcameraillustration] 3/11 at 2024-09-12 20:25:15.813 [fourcameraillustration] 4/11 at 2024-09-12 20:25:15.850 [fourcameraillustration] 5/11 at 2024-09-12 20:25:15.888 [fourcameraillustration] 6/11 at 2024-09-12 20:25:15.938
[fourcameraillustration] 7/11 at 2024-09-12 20:25:16.073 [fourcameraillustration] 8/11 at 2024-09-12 20:25:16.112 [fourcameraillustration] 9/11 at 2024-09-12 20:25:16.148 [fourcameraillustration] 10/11 at 2024-09-12 20:25:16.184 [fourcameraillustration] 11/11 at 2024-09-12 20:25:16.220 [fourcameraillustration] [fourcameraillustration] the animation is finished!
Static Illustrations¶
We can also simply plot a single time, and save that as a PDF.
i = illustratefits('some-directory/cam*/*0001.fits')
i.plot()
i.savefig('a-snazzy-static-plot.png')
[fits-sequence] populating <fits-sequence of 1 images of shape (100, 100)> information from the filenames (like some- directory/cam1/cam1-0001.fits) [fits-sequence] the temporal keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] the static keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] populating <fits-sequence of 1 images of shape (100, 100)> information from the filenames (like some- directory/cam2/cam2-0001.fits) [fits-sequence] the temporal keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] the static keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] populating <fits-sequence of 1 images of shape (100, 100)> information from the filenames (like some- directory/cam3/cam3-0001.fits) [fits-sequence] the temporal keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] the static keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] populating <fits-sequence of 1 images of shape (100, 100)> information from the filenames (like some- directory/cam4/cam4-0001.fits) [fits-sequence] the temporal keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] [fits-sequence] the static keys for <fits-sequence of 1 images of shape (100, 100)> are ['filename', 'camera'] yo! [camera1frame] plotting <F"cam1"> for the first time [camera1frame] {} [fourcameraillustration] {} [fourcameraillustration] included <F"cam1"> in the shared color scheme [fourcameraillustration] included <F"cam2"> in the shared color scheme [fourcameraillustration] included <F"cam3"> in the shared color scheme [fourcameraillustration] included <F"cam4"> in the shared color scheme [fourcameraillustration] defined color scheme with cmap=Blues norm=<matplotlib.colors.LogNorm object at 0x17611d4c0> ticks=[31.788646240357124, 68.21347848994762, 146.37548930256906] [camera1frame] added image of shape (100, 100) to <F"cam1"> [camera1frame] making sure a shared colorbar is set up for <F"cam1"> [camera1frame] added a shared colorbar for <I"FourCamera"> [fourcameraillustration] adding a new colorbar for 4 frame(s) [camera1frame] added time label of "#0" on <F"cam1"> [camera1frame] added arrows on <F"cam1"> [camera1frame] added title of "" to <F"cam1"> [camera2frame] plotting <F"cam2"> for the first time [camera2frame] {} [fourcameraillustration] {} [camera2frame] added image of shape (100, 100) to <F"cam2"> [camera2frame] making sure a shared colorbar is set up for <F"cam2"> [camera2frame] added time label of "#0" on <F"cam2"> [camera2frame] added arrows on <F"cam2"> [camera2frame] added title of "" to <F"cam2"> [camera3frame] plotting <F"cam3"> for the first time [camera3frame] {} [fourcameraillustration] {} [camera3frame] added image of shape (100, 100) to <F"cam3"> [camera3frame] making sure a shared colorbar is set up for <F"cam3"> [camera3frame] added time label of "#0" on <F"cam3"> [camera3frame] added arrows on <F"cam3"> [camera3frame] added title of "" to <F"cam3"> [camera4frame] plotting <F"cam4"> for the first time [camera4frame] {} [fourcameraillustration] {} [camera4frame] added image of shape (100, 100) to <F"cam4"> [camera4frame] making sure a shared colorbar is set up for <F"cam4"> [camera4frame] added time label of "#0" on <F"cam4"> [camera4frame] added arrows on <F"cam4"> [camera4frame] added title of "" to <F"cam4"> [fourcameraillustration] saving figure to a-snazzy-static-plot.png
[fourcameraillustration] saved figure to a-snazzy-static-plot.png

That's about it for the basic one-liner commands. If you want to do something more complicated, it will probably help to read on a bit more about the principle of how TESS Viewer illustrations are structured.
Bug Reports¶
You will probably encounter bugs as you play with this yourself. If so, please do not hesitate to contact Zach Berta-Thompson, or leave an issue on the github repository.