A script to write letters with Matplotlib's scatter plots, create transitions from one plot to the other and build a GIF.
It uses OpenCV to create a mask from an image, draw a plot filled with random x/y coordinates, and filter the points inside the mask.
Then it uses Matplotlib to draw the plots and transitions and ImageIO to build a gif.
pip install scatter_letters
from scatter_letters import sl
sl.text_to_gif('data_')
from scatter_letters import sl
sl.text_to_gif('MAC[MAC]', # text to be converted to gif
out_path='output', # relative path to save temp files and output
repeat=True, # repeat first letter at the end
intensity=40, # more info below*
rand=True, # True=random points, false= evenly sparced
gif_name='movie', # name of the output file. -> movie.gif
n_frames=32, # number of frames in the transition
bg_color='#ffb400', # background color
marker='o', # marker style
marker_color='#2b2300', # marker color
marker_size=3, # marker size
fps=24, # frames per second
alpha=0.7, # markers opacity
axis_on=False, # plot spines and grid
sort_coords=False, # sort points in the transition - options(False, 'x', 'y')
sort_euclidean=False, # sort by distance (this is very heavy)
sort_coords_asc=True, # True - sort ascending / False - sort descending
in_path=None, # for custom input paths
hold_frames=20,) # hold the complete letter for x frameS
*intensity:
When plotting random points (rand=True), this is how many times it'll generate 500 points at the start (before applying the mask).
With randoms, higher intensity means more points.
When plotting evenly spaced points (rand=False), this is the distance between the points.
A lower intensity means the points will be closer to each other with even points, so more points are plotted.
get_masked_data() - Create a list of random x/y coordinates and uses an image/mask to filter them.
text_to_data() - Transform a text into a list of lists with the previous method.
build_gif() - Uses lists of coordinates to build the scatter plots and the transitions, then save the result in a gif.
in_path argument;in_pathExample:
- /current_dir
- /images
- a.png
- b.png
- c.png
- star.png
text_to_gif('abc[star]', in_path='images')
Check out the Jupyter Notebook and the Script at the examples directory for more information.
You can find more images created with this package here

GitHub
PyPi
Medium Article - Basics of GIFs with Python’s Matplotlib
$ claude mcp add Scatter-Letters \
-- python -m otcore.mcp_server <graph>