Flights of Fancy

 I try to avoid flying unless I have to. Air travel is a large source of greenhouse gas emissions. I calculated my carbon footprint here:

I try to avoid flying unless I have to. Air travel is a large source of greenhouse gas emissions. I calculated my carbon footprint here:

Marlo here! I've just returned from a whirlwind overseas vacation. (With some research for the next book I'm illustrating, of course. I can say nothing about this new non-fiction project except that I'm excited to make art about one of my favorite things to draw/paint.)  

In the bare week I've been away, Kev has not only been advancing our Thwaites Glacier animation, but he's been juggling codes and producing a bunch of new animated graphs about the state of our polar ice. Make sure you look through them all, especially the final one, which is a masterpiece. 

Data in creative hands is a thing of beauty isn't it?  

We've also created a Redbubble store. We're excited to offer items featuring our creations, and we'll be adding more very soon. Your purchase directly supports our continuing efforts to spread information about the plight of our vital polar ice. Thank you for your interest and support!

A Very Minke Weekend

  Early stages of the minke

Early stages of the minke

Marlo here. I've been in my studio this rainy weekend, making a minke whale for Kev to animate.

Minke whales are baleen whales, meaning they have baleen plates that filter krill and small fish from the water. Despite being the smallest of the "great whales" or "rorquals" (which include humpbacks and blue whales, among others), minke whales are still huge mammals, up to over 10 meters (35 feet) long.

While I was lucky enough to see a minke whale in the Ross Sea last year, I'd never really looked closely at pictures of them until I sat down to paint one. They have rather long faces and such appealing patterning. 

  Ready to be digitized prior to animation.

Ready to be digitized prior to animation.

Once I'd made her, I had to disect her...

Then it was up to Kev to wave his magic wand (or whatever mysterious coding alchemy he performs). And by the wee small hours, UK time, he had!

Ms. Minke lives! But now she needs a final touch...



There are two subspecies of minke whale: the common (or northern) minke and the Antarctic (or southern) minke. Our minke is the latter. Why are we creating an Antarctic minke? It's one part of the animation we're making about Antarctica's Thwaites Glacier, a glacier of such urgent concern that the US National Science Foundation and the UK Natural Environment Research Council have teamed up in a massive project to study it.

THWAITES Graphic2.0.jpg



Transatlantic Tuesday Night

THWAITES Graphic2.0.jpg

Marlo here. It's been a big week in Antarctic ice news, and it's only Tuesday. Yesterday, the media announced a huge joint project between the US's National Science Foundation and the UK's Natural Environment Research Council to study the Thwaites Glacier.

Studies have shown the Thwaites Glacier is the glacier of most concern. It is accelerating, it's thinning, and it's losing ice ever faster. The Thwaites Glacier is also enormous and contains enough water to significantly raise sea levels. While scientists agree it's in an irreversible retreat, questions remain: how much and how soon? 

Ahead of this news, Kev and I have been deep in preparation both on our animation about the Thwaites Glacier and the graphic above. It's an interesting thing working in time zones 5 hours apart, but as Kev pointed out to me a couple of days ago, he's a serious night owl and I'm a very early bird, so we're on much the same schedule. 

To coincide with yesterday's announcement, we were also interviewed by Brian Kahn of EARTHER. He had seen the Antarctic ice thickness maps Kev made from Antarctic ice thickness data. 

Kev says, "The data was in huge text files of hundreds of megabytes. Literally rows and columns of numbers. I wrote a program that read the files and plotted a grey pixel based on the value found. Never expected it to be so beautiful."

 Antarctic ice thickness                                                                                                BedMap2 + Somedudeonasofa

Antarctic ice thickness                                                                                                BedMap2 + Somedudeonasofa

Now, we know the Antarctic glaciology crowd has seen this data in map form before. Perhaps it even becomes humdrum after a while. But to us, it was a moment of pure magic. We continue to be blown away by how exquisite they are.

We've also been thrilled to see so many people engaged by their beauty and asking to know more about what they represent and why we're making what we're making. This is, after all, our mission at Pixel Makers & Movers — to share information about our changing polar ice with as broad and diverse an audience as possible. 

 Topography + ice thickness                                                                                        BedMap2 + Somedudeonasofa

Topography + ice thickness                                                                                        BedMap2 + Somedudeonasofa

BedMap (1) zoom.jpg

Big, isn't it?


The Night Before World Penguin Day


Marlo here. I've just come back from my annual NESCBWI conference, which was wonderful as always. I attended my buddy Russ Cox's session on character design on Friday, which really got me thinking about not only character design in general, but the design of our penguins.

Russ, who is a master of character design, had us try a progression of speedy, unexpected drawing experiments, which immediately pushed me to draw in ways I usually don't. They allowed me to loosen up and explore in ways I hadn't considered.


Now, these rough sketches may not look like much, but to me what they represent is something very exciting indeed—both for our Pixel Movers & Makers work and for my illustration style in general. My transition from wildlife artist to illustrator has not been speedy or always smooth, so I do need these reminders to step outside my comfort zone—clearly displayed in the image at the top of this post—and remember I also love to make stuff like this:


I hope to create a place in between for our animations.

Now, back to the drawing board!



Tuesday Night Mad Scramble

The last couple of weeks have been a whirlwind of activity for us both. Kev has been keeping himself busy while I prepare for NESCBWI 18. Check out his latest illuminating animation — It's a map, and your home is on it

I’ve been readying my postcards and illustration portfolio for this Friday night's Portfolio Showcase, in which art directors, editors, and agents, followed by conference attendees, will have a chance to peruse each illustrator’s portfolio. 


My big goal over the last two weeks has been to create a new Antarctica-inspired piece. As you may have realized by now, we're both enthralled by polar ice. I'm particularly interested in the relationship between polar ice and the ecology of the surrounding environment (as well as how that ecology acts upon the ice itself), and primarily, how it affects the success of phytoplankton. Among other things, I've been wanting to make a piece that explores the role of icebergs in ocean fertilization. 

I decided to make something showing a simplified food chain around the iceberg, with an informational shape poem about the "life" of an iceberg, from the formation of the glacier from which an iceberg calves to its eventual melting out at sea. 

Last week, I showed you the early stages of that process

 After a detailed pencil drawing of each element, which I scan, I am using digital oil paint.

After a detailed pencil drawing of each element, which I scan, I am using digital oil paint.

Since then, it's been a race against the clock to complete the illustration in time for my printer to do their thing. (Shout-out to fantastic Iolabs who patiently put up with my last-minute rush every April; thanks Emma!) 

And now for the reveal of the final piece:

  Text and image Copyright © Marlo Garnsworthy 2018                                             

Text and image Copyright © Marlo Garnsworthy 2018                                             

Now, it's back to making penguins for Kev to swim and waddle!


Note: this post also appears on my Wordy Bird Studio and Polar Bird sites. 

Actual pixel moving

Kev here: After an online, shall we say, discussion about how much of a map showed average temperatures, I felt I needed a really intuitive way of depicting just that. As it became increasingly clear, it's really difficult to eyeball something like this:


...and conclusively state that there are more "warmer than average" than "cooler than average" areas, especially when taking into account the crazy distortions of the equirectangular projection. To be fair, the discussion was mainly based on maps using the Kavrayskiy VII projection, which has its own distortions, but I digress.

So what to do? I wanted to create an animation that was short, simple, and intuitive but without involving figures like percentages and square areas, etc. It came to me that it would look cool to see the colours on the map pick themselves up and organise themselves into a column showing their respective proportions.

This would mean I'd need to read each pixel, one at a time, and work out its area, then slide it across and position it in a column. The tool best suited for this sort of thing would be Processing, which is a special purpose animation language.

So, the general idea is that I map (that's mathematically map, not geometrically map) a colour to a temperature value (conveniently, ClimateReanalyzer provides a legend at the bottom with all the colours in it!) and then run through them incrementally finding in the map (the geographical one this time) the pixels with that colour, delete them, and steadily move them at a certain speed and direction until they arrive at the right point. Simple!

Yeah, like I said, "simple."

So, the algorithms I used the most are: one to work out the area of a pixel from the equirectangular projection and one for the acceleration/deceleration motion of the pixel. Everything else was mainly data structure manipulation to remember where pixels are, where they are going to, and how many are already at their destination.

The equirectangular projection, although not the most aesthetically pleasing or the least distorted, has the great advantage that the area of each pixel is super easy to calculate. It only depends on the latitude: you just work out the area of a ring of latitude around the planet and then divide it by the number of pixels horizontally, in this case 1040. 


As the projection's y axis is merely the latitude, we know how many degrees per pixel (simply divide 180 by the height of the map), so we can easily work out lat1 and lat2 from the y coordinate. Just add in the radius of the Earth, and Robert's your mother's brother.

To make the movement of the pixels as natural as possible, I used what is known as an easing function. The one I chose is the in/out cubic function, which produces motion that looks like this:


There are many to choose from, including ones with bounce and elastic motion.

After much experimentation, I created a first draft:

But I felt the single column didn't highlight the near-average colours very well; they were quite washed out and hard to distinguish. With the help of Marlo and her top-notch palette modification skills, we tried modifying the colours so that the bar showed more contrast, but we soon came to the conclusion that unless we went with some quite psychedelic colours, the single bar wasn't going to work very well.

So, I decided to try three bars: one for the "lower than average" temperatures, one for the "average temperatures," and one for the "higher than average" temperatures. As the average temperatures were just one colour, the same animation wasn't going to work very well, so I went with a right-to-left swipe, resulting in the finished article:

Tuesday Night Arting

 This is the level of polish I'm heading for in the artwork I'm creating tonight. (See, I just love Antarctic krill!)

This is the level of polish I'm heading for in the artwork I'm creating tonight. (See, I just love Antarctic krill!)

Marlo here. Tonight, I'm taking a different artistic approach to what I've shown you so far. I'm employing a technique I use quite often, including in VOLCANO DREAMS by Janet Fox, which comes out in September.

It's a multi-media approach, and it employs digital tools. First, I spend many hours designing the piece. (I'm not going to reveal that design until the piece is complete, however—one must keep a little mystery before the big reveal. This one happens to have an accompanying acrostic poem—a shape poem—which was very fun to play with.)

Once I have a solid idea and have developed the design, I run it by my critique partners for feedback. I have a great team for that—which includes the lovely, talented members of Team WD (consisting of Priscilla Alpaugh, Julia Ann Young, and Emily Wayne), plus my extremely talented artist mum, Patricia Tremayne, who has taught me so much of what I know. I also run it by my writing crit group, who are talented visually, too, and other family. It's key to get feedback from both other artists and non-artists to make sure everything is working and "reads" well. (Kev actually made a great suggestion on the design for this piece, too, which I was grateful for.) 

Once I've tweaked the design, I draw individual elements, such as this humpback whale. I use a mechanical pencil on Strathmore drawing paper, which I like for its texture. 

IMG_9769 (1).jpg

Then I get them into my computer and start the next—and digital—stage. 

When you're on a tight illustration deadline and you have a publisher requesting last-minute changes, it's great to have each element on a separate layer, so it can be recolored, resized, or deleted, etc. at will. I use both Photoshop and Corel Painter, and I frequently flip back and forth between the two on any given piece. I'm on a super-tight deadline for this piece, so this method is really going to work for me.

Once I have the drawings in, I lay in some color and start to work the piece up using digital oil paint. For SOOOO many years, I wished for a way to combine pencil and oil paint—and with these digital tools, I can! 


I'm also layering in some real watercolor, just as I did for VOLCANO DREAMS.

 Starting to work the krill up a bit...

Starting to work the krill up a bit...

I have four evenings left to finish this piece in time to have it printed ahead of NESCBWI8. So, I must away!


Monday Night Paint-Splashing

                                                                 Watercolor penguin (sans flippers) trial

                                                                Watercolor penguin (sans flippers) trial

Monday Night Marlo here. Tonight, it's all penguins all the time. And maybe some sea ice. 

Kev and I are done with sketchy penguins. (And if you know Adélie penguins, you'll know they can be a bit sketchy.) We're ready to insert some final art into the first part of our animation! 

Ooops! Kev now has them swooping gracefully up out of the water and landing on the sea ice with much cuteness. 

So, this is the point at which we need to make some more serious decisions re medium and style, and then I need to pull that off. While I tried some pencil + digital oil penguins, they felt quite wrong for this project.


Real watercolor — which I've been using for my Polar Ice Sketch Project, for the painting demos I've posted here, and for the sample animation Kev and I created for APECS — seems like the natural choice.

I experimented over the weekend...

I'm not sure I've made exactly the right penguins yet, so paint penguins I shall continue to do! 



Monday Night Paint-Splashing


Marlo here. It's Monday evening, the day after the final day of Polar Week. We of Pixel Movers & Makers have been making all sorts of things and even writing polar haiku! (#PolarHaiku) Have you checked out Kev's coding posts yet? It's mind-bending stuff. Amazing what numbers and symbols can do when you understand how to manipulate them, eh?

Look at one of the things we've made on the way to making our ultimate first thing!

Just imagine how it will look when we have final art and all the movements exact. It's enormous fun to see things I drew or painted coming alive. (I break into delighted chuckles every time Kev sends me new iterations.) 

Meanwhile, I've been practicing watercolor techniques and creating more art for the Polar Ice Sketch Project. (The banner art on this website is part of this project.)

I'm about to show you how I painted the piece above from start to finish. Don't laugh. I've gotten a little bit brave, and I talk my way through it, explaining what I'm doing at each stage. (This is my sixth attempt at this, and most times I push the wrong button on my phone and awkwardly wax poetic, only to find I've recorded the ceiling or nothing at all. Pity about the Mr. Squiggle anecdote, but you've missed out. Or have you?)

My point (apart from Mr. Squiggle being one of my early heroes) was that I often turn my paper while I'm painting. Gravity is a key player, as are the paper itself (Arches hot press, expensive but unparalleled) and the paint (Windsor & Newton, the professional grade stuff). Skimping on the quality of paint and paper is self-defeating. (For me, watercolor is all about letting the water, medium, and surface take over. It's fun and freeing and a real meditation at the end of the day.) 

Hope you enjoy this window into Pixel MnM's US base. In which paint craftily defies gravity (and I learn to feel more comfortable in front of my phone). It's very loooong, but it's very real.

What I most want you to know, though, is that our polar ice — our glaciers and our ice shelves, our icebergs and our sea ice, our snowy polar places — are beautiful.

They're extraordinarily beautiful, and it's critical that we're aware of and care for them. 





Sunday Afternoon Coding

Hi, Kev here. Last week I described how to load the gridded global temperature data into memory; this week I'll describe how to render it on a map.

First, let's get some structural bits done. I'm going to render one month per frame, which simply means I'll need a variable to hold the month number and another for the year. I'll set them both to the start date. As the contents of these variables will need to be retained between frames, the variables will need to be defined outside the draw() function like so:

int month = 1;
int year = 1880;
void draw()

Inside the draw() function, I increment the month number every frame, and when it gets to greater than 12, I then increment the year and set the month back to 1.

void draw()
  println(month + " " + year);
  if(month > 12)
    month = 1;
    if(year > 2017)

This should output:

7 1880
8 1880
9 1880
10 1880
11 1880
12 1880
1 1881
2 1881
3 1881
... the console. These are our keys for the HashMap.

I then set the size to HD (1920 by 1080) like so:

void setup()

So now we are good to go.

I'm now simply going to plot the data in a square grid. First thing's first: I need to get the temperature data given the month and year. So, just before I increment the month, I add this code:

String dataKey = month + " " + year;
int[][] temperatureGrid = data.get(dataKey);

temperatureGrid is a 37 by 73 array, which means we can loop through it like so:

  for(int x = 0; x < 37; x++)
    for(int y = 0; y < 73; y++)
      print( temperatureGrid[x][y] + " ");

This prints out all the data to the console


Now I'll draw dots for each temperature on the screen in a grid. For the colours I use a function called lerpColor(). "lerp" is a contraction of "linear interpolation". It merely means, given two numbers, find me a number in between. So, to find a number three quarters of the way between 10 and 20, you'd give a lerp function: 10, 20, 0.75 and it'd spit out 17.5. For lerpColor() you give it two colours and a fraction, and it'll spit out a colour in between those colours.

Colours are represented as three numbers between 0 and 255. Each of those numbers are the level of red, green, and blue respectively. So color(255,0,0) is red, color(0,0,255) is blue, and color(255,255,255) is white.

I'm colouring the above normal temperatures with red and the below normal temperatures with blue. Temperatures near normal are white.

I replaced print( temperatureGrid[x][y] + " "); above with the following:

float temperature = temperatureGrid[x][y]/100.0;
color tempColour;
if(temperature >= 0)
  tempColour = lerpColor(color(255,255,255), color(255,0,0), temperature);
  tempColour = lerpColor(color(255,255,255), color(0,0,255), -temperature);


This creates the following:


Making pretty good progress with only a few lines of code! Evidently, I have got my x and y coordinates around the wrong way. Let's fix that and make them pixels larger:

for(int x = 0; x < 73; x++)
  for(int y = 0; y < 37; y++)
    float temperature = temperatureGrid[y][x]/100.0;
    color tempColour;
    if(temperature >= 0)
      tempColour = lerpColor(color(255,255,255), color(255,0,0), temperature);
      tempColour = lerpColor(color(255,255,255), color(0,0,255), -temperature);
    int x10 = x * 10;
    int y10 = y * 10;
    rect(x10, y10, x10 + 10, y10 + 10); 

Giving us:


Lovely. If you squint, you can make out the continents! Hang about---why are they flat blue? Ah! missing values are marked as -9999, so therefore, they are blue as that's very much below normal. I'll mark those as grey color(150,150,150). As the colour code is getting cumbersome, I'll extract it out as a function like so:

color getColour(float temperature)
  if (temperature < -90)
    return color(150,150,150);
  color tempColour;
  if(temperature >= 0)
    tempColour = lerpColor(color(255,255,255), color(255,0,0), temperature);
    tempColour = lerpColor(color(255,255,255), color(0,0,255), -temperature);
  return tempColour;



Ok, that looks pretty good. But squares greatly distort the area of each segment of the earth's surface. What we need is a proper sphere projecting function of which there is no end of choice.

My favourite is the fabulously named Kavrayskiy VII projection:


The projection is defined as:



This is really very simple. It just looks complicated because of all the Greek symbols and what-not. λ (lambda) is the longitude, and φ (phi) is the latitude in radians. I'll stick with radians, as computers by default use radians, so no need to convert.

Right, from the get-go I can see that the y coordinate is merely the latitude. Happy days. The x coordinate is calculated as follows in code:

float x = (3.0 * lng / 2.0) * sqrt( (1.0 / 3.0) - sq(lat / PI));

The sqrt() and sq() functions are square root and square respectively.

Processing has the type PVector, which allows us to handle an x,y coordinate pair, which means I can create a function like so:

PVector getKavrayskiyVII(float lat, float lng)
  float x = (3.0 * lng / 2.0) * sqrt( (1.0 / 3.0) - sq(lat / PI));
  return new PVector(x, lat);

Which returns the x and y coordinates of a given longitude and latitude.

The problem I have now is that I'm looping through the x and y coordinates when I now need to loop through the longitude and latitude angles. The data is for 5° by 5° segments of the surface or π/36 radians. So my loops now need to look like:

float step = PI/36.0;
float halfPi = PI/2.0;
int latCount = 0;
int lngCount = 0;

for(float lng = -PI; lng < PI; lng+=step)
  for(float lat = halfPi; lat > -halfPi; lat-=step)
    float temperature = temperatureGrid[latCount][lngCount]/100.0;
  latCount = 0;

As I am working out four points surrounding a point on a sphere, I get the top-left, top-right, bottom-left, and bottom-right points like so:

float halfStep = step/2.0;
PVector tl = getKavrayskiyVII(lat + halfStep, lng - halfStep);
PVector tr = getKavrayskiyVII(lat + halfStep, lng + halfStep);
PVector bl = getKavrayskiyVII(lat - halfStep, lng - halfStep);
PVector br = getKavrayskiyVII(lat - halfStep, lng + halfStep);

To draw a four sided irregular polygon I'm using the quad() function where s scales it to a nice size:

float s = 170;
  tl.x * s, -tl.y * s, 
  tr.x * s, -tr.y * s, 
  br.x * s, -br.y * s, 
  bl.x * s, -bl.y * s

Which generates:



How about that, eh?

The complete code can be found on github. Fork it and have fun!

Next week, I'll overlay it on the map of the earth from above.