Photo Journal

Spectral Reflectance of Crayons,

Crayons under the spectrophotometer

by |

Most people have forgotten the mysterious questions that a box of crayons presents to a kid such as: what am I supposed to do with this useless white crayon? why is the yellow crayon so dark and greenish, but draws such a pure, light yellow? is it just my eyes, or are the paper wrappers on the blue, indigo, and cerulean crayons the exact same color?

I did not forget. These questions have been nagging me since kindergarten and this weekend I finally got to the bottom of it. I am now able to answer that age-old question: what really is the difference between green-yellow and yellow-green?

Starting with a fresh box of twenty-four Crayola crayons I measured each with an i1 pro spectrophotometer to create a set of spectral power distributions (SPD) of the reflected light. You may not know this, but a spectrophotometer is good for much more than creating screen and printer profiles—for instance, I can tell you with some precision the color of my tongue (and my dog's).

The image above is what a box of crayons looks like broken into it's spectral components.

It seemed a waste to have this all in one place and not calculate the lab values
LAB colors of 24 Crayola crayons

and also the xy chromaticity coordinates, which are plotted below with the sRGB gamut for reference.
24 Crayola crayons on chromaticity diagram

If you are interested in a handy, poster-sized pdf with all this information so you can answer your own unresolved colorimetric questions, you can download it here:
PDF Thumbnail

A note on method

The measurements were made off the crayon itself, not the mark it leaves on paper. This is important because a single crayon is capable of many different shades. The material is translucent and gradually builds up toward the color of the actual crayon which is much darker than the color it leaves on paper. Obtaining the color of the actual crayon on paper has, since childhood, seemed an impossible feat.

Extra credit for math geeks

In the chromaticity diagram above, knowing only the x and y coordinates of the dots, how do you sort the list of color names so that no lines cross? (They're currently sorted by the y coordinate.)

p.s. The charts were created using Nodebox, which is a terrific piece of software for creating just about anything visual with Python.

34 Reader Comments

joanne Seaberg

You keep me humble - but humble with a smile.

Miles Bader

Do you think you could release the SPDs of the individual crayons in some easy-to-parse textual form?


math geek here. put all your labels in one place so that all the lines intersect at the same point. now you can fan them out.

John Harvey

Cool graphs. The sort problem is interesting and my math geek isn't much higher than red belt.

In an ideal world, you want to sort by the Y position + slope of the line to the legend entry * x distance to the legend. The problem is the slope changes with the sort order and is influenced by where the legend is placed on the graph.

I suspect if you sort by k * y + x you might do a little better than you have. Try something like 5*y + x.



> In the chromaticity diagram above, knowing only the x and
> y coordinates of the dots, how do you sort the list of
> color names so that no lines cross?

If the left vertex of the triangle is at (x0,y0), then you can sort the dots by the angle between the Y axis (x0,y0)-(x0,Infinity) and the line (x0,y0)-(x,y), i.e.,

acos[ (y-y0) / sqrt((y-y0)^2+(x-x0)^2) ]

The lines joining each dot and the colour name need to be radial from the vertex; for a text position similar to the one you have now you would need to use an (x0,y0) above the left vertex at nearly the y position of the centre of the triangle.

Carl-Johan Kjellander

Sorting algotithm in O(n²) time.

1. Start with the lowest label point.

2. Find the dot that has the lowest value for deltay / deltay where the deltas is the distance in the x and y direction and deltay can be both positive or negative.

3. Go to the next label position and repeat 2.

ps. This is basic trigonometry and you could use atan or atan2 to actually get the angles but there is no need. ds.

Carl-Johan Kjellander

Oh, type. Find the minimum for: deltay /deltax


Cool idea! Two questions:

Did you measure the crayon as-is, or after breaking/cutting/grinding? One of the things I noticed as a child is that the apparent color of a crayon often changed when the surface was new vs. freshly broken vs. worn from rubbing against (clean) paper. Though I don't know if this is spectophotometric or just psychological.

Also, I don't know if Crayola uses fluorescent pigments in the standard 24-pack, but they do have fluorescent crayons. I'm not familiar with the i1 pro, but wouldn't the presence of fluorescent pigments complicate the measurements? Would it be easy/possible to check for fluorescent pigments?


What software did you use to make those graphs?


Thanks for sharing this Mark.

Would you consider doing this for the common colors of Legos?

M. Wade

The layout problem is much more difficult if you put all the labels on one side. It is much easier if they can be around the entire periphery of the diagram.

Assuming this layout, first pick a center point. Using the CIE white point is the logical choice. For each point, compute it's radial coordinates from the center. The labels are then ordered around the center based on their angular position. The labels should be equally spaced around the edges, as opposed to just projecting the vector out from the center and putting them where it intersects the boundary.

No lines will cross, because the point set can be projected onto a circle, and lines from a circle to it's center don't cross.

I also believe that this will be a more aesthetically pleasing layout, and will convey additional information about the relationship of he colors. This is why the CIE white point should be the center, because it relates the angular ordering to the CIE color space.


First, I love the charts! Thanks for sharing them!

For the sorting, it really depends on what restrictions you're placing on the location of the legend. Possibly the easiest option is to place no restrictions on the legend locations, in which case, simply choosing a center point (perhaps the average of all coordinates) and drawing a radial line from the center for each color should do it.

Otherwise, if there's a fixed legend location, there's only 24! possible layouts... and I don't know any math that will simplify a brute force loop of those. Simply sorting on slope as others have suggested won't work, because some will seem quite counter-intuitive (i.e. cerulean might need to be above yellow-orange).

I think it's more of a comp-sci problem than a math one, but that could just be me...


So what is the expected range of colours from each crayon as put on (white) paper? Does that mean lines going straight up in the chromaticity diagram? Do any overlap? Would any on different paper?

Oh, and so not a math geek, but drop a line pivoting on the top tag position until first (closest) hit, then repeat with line starting from next position through previous point. Or use a simple ax+y as mentioned, using, say, the slope of the line through the top point to the top tag, again closest to tag first.


For sorting, you need to do an axis shift. Since your labels are in a vertical line, project all points onto that line.

So the one with the lowest paper-space y (vertical) would be on the bottom. In case of conflicts, use the x coordinate to break ties (closest to legend goes first).

You could probably also use a line from the top vertex of triangle perpendicular to bottom edge.


Lazy algorithmic method:
1) Start from the top, scan down and find the first crossing.
2) Swap positions of the crossing lines.
3) Goto 1


Hope you're ready to receive a C&D; letter from Crayola for reverse-engineering their crayons colors! :P


Can you provide me with a list of color names and their x-y coordinate pairs on the chromaticity chart? Thanks!

The Geoff

@ M. Wade - I was looking at a very similar idea - take the normal of the triangle and then define the label lines as parallel to it. Then bend them away from the triangle's normal...apply a vector away from the normal with a direction and magnitude proportional to the distance from the white point. It looks a bit like one of those fibre-optic lamps in my head.


@RM, that opens up a whole new bag of worms. You need to add another full dimension for the stimulating color. That would make this chart an overlaid set of surfaces. Now, add in the spectral component and you need to figure in the *angle* of the incident light.....

Crud, this just got really complex. (oooww, sorry, Euler.)

Extra Credit

My proprietary mega-algorithm tells me the following should work ;)


Does it?


Carl-Johan Kjellander's solution is correct, but maybe I can explain it better for non-mathgeeks. He worked from the bottom up, but I'm going to work from the top down.

Imagine we drop a horizontal stick so that it falls and rests upon the "highest" point on each side. The idea is that *all* other points will fall below this stick, and therefore none of the other lines could possibly cross it. Note that this stick is going be at some angle, so it's not necessarily going to rest upon the point on the left with the highest Y position. It will rest upon the point that gives the smallest upwards slope (or the greatest downwards slope). Once you find that line you remove those two points and repeat the process until you're done.

Now I'll explain it in a more exact and mathematical way. Firstly, you need to know the X,Y coordinates of the points on the right. Start with the top point on the right and find the slope to each point on the left (that would be the difference between the Y values divided by the difference between the X values). Select the point with the lowest slope. If there is a tie, select the point with the largest X value. That is the first color in your list. Then remove those two points from consideration. Repeat with the next top point on the right to find the next color.


Hi Mark,

Just to echo Blueraja's question - what software did you use to generate the plots in this post?

It appears to me like it could have been done in processing - if so would you mind showing the code you used to generate the plots?



I'm surprised that all of these crayons except, marginally, yellow and dandelion, fall inside the sRGB gamut. Are you certain you're not being restricted by the range of your measuring device?

Certainly when I've taken photos of a range of crayons before, the oranges, cyans and deepest violets fall way outside sRGB and I have to do some serious correction to try to maintain a realistic relative appearance in the image.


I second the request by Miles Bader: can you provide the raw SPD data? I'd love to play with it.



I'm not familiar with the i1 device, but from what i guess from googling is that it is used for measuring emiting light sources like a display. To measure the SPD of a non emiting colored object you have to measure the light reflected off the object. So you need a calibrated light source like D65, otherwise your result will vary according to sunlight conditions and time of day.

Or you need a measuring device that has it's own known light source. Does the i1 have a built in light source?

Chris Hardin

Kjellander's solution works. It can be improved to O(n log n) by restructuring as a divide and conquer: take the middle label, and match it with the point such that the resulting line divides the remaining set of points in half, then recur on each half. The divide step takes linear time because we can get the kth smallest element out n unsorted elements in O(n) time if we're smart.

More generally, if the label positions are arbitrary, we can still arrange the labels to avoid having lines cross. Form the graph of all edges from a point to a label, with edge weights given by length. Find a minimum weight perfect matching; there is a polynomial time algorithm for this. That minimum weight matching will have no crossings: if there were a crossing, we could get a lower-weight matching by swapping the two labels involved in the crossing. (Note: By "crossing" I mean two lines crossing at an angle. If you're in a situation where two lines are "stacked" on top of each other, you might not be able to eliminate that.)

Mark Meyer

Wow, thanks so much for all the math/c.s. advice. Really, that's going to keep me busy for a while.

Crayoff: The i1Pro has a calibrated internal light source for making reflective measurements. It has a matched calibration tile that is used to calibrate before each use. It's main purpose is for making printer profiles by measuring printed color patches.

Mark: The i1 breaks the light into spectral components so it shouldn't have a limited gamut. Visually, I get a pretty good match between the Lab values on screen and what I see in box of crayons. Having said that, looking a two-dimensional chromaticity diagram a projection of a three dimensional space and may not be the best way to determine if colors fall within a gamut. It would be interesting to plot the XYZ values in something like Blender and compare to known color spaces.

Mark Atwood

Have you seen

They keep a database of "commercial tints" that they can match and compare, so you can find the closest match from one set of color sources to another, and map them all to and from rgb.


What software did you use with the i1 Device?


It seems a waste to compute lab values and then display them in an unreadably small font with many in low contrast colors.

Mark Meyer

Tyler—I used some of the tools that are part of the open-source ArgyllCMS package.

pjcamp—I included a link to a pdf, which if you so desire you can render to any size and contrast ratio your heart desires.

Ernst Dinkla


Did you use an i1 Pro that has an UV filter internally? All the spectro plots drop at the left including the white crayon.

Measuring on the pencil core itself must be difficult given the 4.5 mm aperture of the i1. Did you create a powder of it and pressed that powder more or less to a tablet?

Ernst Dinkla

Seth Ansell

Hi Mark,

Nice plots. Just a couple small technical points. You've measured and displayed plots of the spectral reflectance factor values of the crayons. The term spectral power distribution (a.k.a. spectral radiant power distribution) is reserved for describing the spectra of a light source or of an illuminant.

Also, I've never seen the Y-axis of a spectral reflectance factor plot labeled as a log scale as your plot is labeled. Spectral reflectance factors are usually expressed in linear form, and are bounded between 0 and 1, or if measuring percent reflectance, 0% and 100%. Having said that, the values your graphs show look linear to me.

Spectral reflectance factor values greater than 1.0 (or 100%) can occur when the substrate (paper) or colorant (crayon in this case) is sufficiently fluorescent. In this case they are called spectral radiance factor values.

See Color Science: Concepts and Methods, Quantitative Data and Formulae by Wyszecki & Stiles for a wealth of precise information on these and other topics related to color science.




Love this!!! Having worked for HunterLab at one time I am ashamed we did not do this for a marketing ad.

Comments are closed for this note