Color Memory Game
By John K.··17 min read

Star colors: every spectral class measured, and why none of them are red

Thirty-six stellar spectral classes rendered to hex from the Pickles stellar flux library. The coolest star in the library comes out #FFC96F at hue 80 degrees, which is yellow. Not one class reaches the red sector, 18 of 35 neighbouring classes are indistinguishable, and the blue end stops changing above 28,926 K.

Every page about star colours gives you the same ladder. Blue is the hottest, then white, then yellow, then orange, and red is the coolest. O B A F G K M, a mnemonic about an oh-be-a-fine-girl, and a row of coloured dots running from a blue one to a red one.

I went to put real hex codes on that ladder. The data for it exists and has for nearly thirty years: Pickles assembled a library of measured stellar spectra covering every spectral type, averaged from real observations of real stars, and it is sitting on a public server. Feed each spectrum through the CIE colour matching functions and you get the colour, properly, with no artistic licence anywhere in the chain.

The red rung is not there. The coolest star in the whole library, an M6 dwarf at 2,698 kelvin, renders as #FFC96F at a hue angle of 80 degrees. Eighty degrees is yellow. Red is down near 40. Not one of the thirty-six main-sequence classes I rendered lands anywhere near the red part of the circle, and the closest any of them gets to actual red is 28.38 CIEDE2000, which is about a dozen times the threshold for seeing a difference at all.

Here is the sequence, from the hottest star in the library to the coolest, rendered the same way every other colour on this site is rendered: against the D65 white point, which is what your screen means by white.

O5 V39,811 K#96B1FF · C* 55.68 · hue 283.3° · 24.77 from white
O9 V35,481 K#94B5FF · C* 52.67 · hue 280.2° · 24.15 from white
B0 V28,184 K#98B4FF · C* 53.00 · hue 282.5° · 24.23 from white
B1 V22,387 K#A1BBFF · C* 46.42 · hue 280.9° · 22.79 from white
B3 V19,055 K#A2BEFF · C* 44.62 · hue 280.1° · 22.35 from white
B5-7 V14,125 K#A9C1FF · C* 41.58 · hue 280.3° · 21.59 from white
B8 V11,749 K#AFC4FF · C* 39.04 · hue 281.6° · 20.94 from white
B9 V10,715 K#B4C7FF · C* 36.06 · hue 281.1° · 20.07 from white
A0 V9,550 K#B5CAFF · C* 34.08 · hue 279.5° · 19.42 from white
A2 V8,913 K#B8CBFF · C* 32.87 · hue 279.8° · 19.04 from white
A3 V8,790 K#C0D1FF · C* 28.39 · hue 279.4° · 17.47 from white
A5 V8,492 K#C6D7FF · C* 24.40 · hue 276.6° · 15.83 from white
A7 V8,054 K#CED9FF · C* 22.54 · hue 281.6° · 15.18 from white
F0 V7,211 K#DDE3FF · C* 16.12 · hue 283.3° · 12.11 from white
F2 V6,776 K#E7ECFF · C* 10.65 · hue 282.8° · 8.80 from white
F5 V6,531 K#F1F2FF · C* 7.20 · hue 290.2° · 6.57 from white
F6 V6,281 K#F4F2FF · C* 7.07 · hue 298.4° · 6.79 from white
F8 V6,039 K#FFF9FF · C* 3.70 · hue 325.7° · 4.53 from white
G0 V5,808 K#FFF8FC · C* 3.38 · hue 337.9° · 4.39 from white
G2 V5,636 K#FFF4F2 · C* 4.16 · hue 35.3° · 5.00 from white
G5 V5,585 K#FFF4ED · C* 5.46 · hue 59.9° · 5.48 from white
G8 V5,333 K#FFEEE3 · C* 8.78 · hue 60.6° · 8.17 from white
K0 V5,188 K#FFEADD · C* 10.83 · hue 59.5° · 9.72 from white
K2 V4,887 K#FFE1CB · C* 17.62 · hue 65.4° · 13.50 from white
K3 V4,498 K#FFD8C5 · C* 19.80 · hue 54.2° · 15.37 from white
K4 V4,345 K#FFD4B5 · C* 26.46 · hue 63.0° · 17.66 from white
K5 V4,188 K#FFC8A3 · C* 34.63 · hue 61.3° · 20.47 from white
K7 V3,999 K#FFC693 · C* 42.06 · hue 67.2° · 22.08 from white
M0 V3,802 K#FFC698 · C* 39.75 · hue 65.4° · 21.60 from white
M1 V3,681 K#FFCA95 · C* 41.26 · hue 70.0° · 21.78 from white
M2 V3,548 K#FFC58B · C* 45.81 · hue 69.8° · 22.85 from white
M2.5 V3,443 K#FFC788 · C* 47.62 · hue 72.8° · 23.17 from white
M3 V3,304 K#FFCC88 · C* 48.15 · hue 76.9° · 23.22 from white
M4 V3,112 K#FFD386 · C* 49.84 · hue 82.0° · 23.53 from white
M5 V2,951 K#FFCB7C · C* 54.02 · hue 78.4° · 24.43 from white
M6 V2,698 K#FFC96F · C* 60.98 · hue 80.0° · 25.72 from white

Brightness is not in these swatches. A star’s apparent brightness depends on how big it is and how far away, which has nothing to do with what colour its light is, so every swatch is normalised to the same lightness and shows hue and purity only. The numbers are CIELAB chroma, CIELAB hue angle, and the CIEDE2000 distance from a neutral white of the same lightness.

The red that is not there

Fifteen of the thirty-six classes come out warm and visibly coloured. Their hue angles run from 54.2 degrees to 82.0 degrees. That is a twenty-eight degree band, and all of it is on the yellow side of orange.

For scale, here is where those stars sit against colours you can name.

CSS red40.0° · what we call these stars
K3 V, the most orange class54.2°
Betelgeuse, M2 supergiant75.4°
M6 V, the coolest in the library80.0°
CSS gold91.3°
CSS yellow102.9° · the yellow limit

Betelgeuse is the star everyone reaches for when they want to say red. It is a red supergiant, it is in the red corner of Orion, and the pictures are always orange-red. Rendered from the M2 supergiant spectrum it is #FFC475, and the distances come out like this:

Betelgeuse, measured
#FFC475 · hue 75.4° · C* 57.31
CSS orange, 10.45 away
#FFA500 · hue 73.1° · the nearest named colour
CSS darkorange, 14.85 away
#FF8C00 · hue 64.0°
CSS orangered, 29.69 away
#FF4500 · hue 45.5°
CSS red, 34.84 away
#FF0000 · hue 40.0° · the name it actually gets

Thirty-four point eight. The smallest colour difference a person can see is about 2.3, so the name is wrong by roughly fifteen of those. Nobody would describe a tangerine as red, and a tangerine is closer to red than Betelgeuse is.

This is not a quirk of the rendering. It comes straight out of the physics. A star emits across the whole visible band at every temperature, and even at 2,700 kelvin a good fraction of its light is still green and blue. To look red you have to subtract the short wavelengths, and nothing is subtracting them. A candle flame gets away with looking orange because it is cooler still and because you see it against a lit room; a star is a thermal source with nothing in front of it. Red would require a temperature low enough that the object stops being a star.

I should say that the naming is not stupid. Astronomers never meant the word as a colour sample. “Red” in red dwarf and red giant is a direction, not a destination: it means redder than the rest, which is true, and it dates from an era of photographic plates and eyepieces rather than colorimetry. But the word has escaped into the charts, and the charts now show a red dot.

The ladder has very uneven rungs

The seven-letter sequence is usually drawn as seven equal steps. Here is what the steps actually measure, using one representative class from each letter.

O>30,000 K#96B1FF · C* 55.68 · hue 283.3° · 24.77 from white
B10-30k K#A2BEFF · C* 44.62 · hue 280.1° · 22.35 from white
A7.5-10k K#B5CAFF · C* 34.08 · hue 279.5° · 19.42 from white
F6-7.5k K#F1F2FF · C* 7.20 · hue 290.2° · 6.57 from white
G5.2-6k K#FFF4F2 · C* 4.16 · hue 35.3° · 5.00 from white
K3.7-5.2k K#FFC8A3 · C* 34.63 · hue 61.3° · 20.47 from white
M2.4-3.7k K#FFC58B · C* 45.81 · hue 69.8° · 22.85 from white

Step by step, in CIEDE2000: O to B is 2.05, B to A is 3.53, A to F is 15.26, F to G is 8.05, G to K is 17.29, K to M is 5.93. The largest rung is 8.4 times the smallest. The O to B step is sitting right on the threshold of visibility while the G to K step is nearly eight times over it.

Go finer and it gets worse. Across the thirty-six individual classes, 18 of the 35 neighbouring pairs are closer together than the 2.3 threshold, which is to say you could not tell them apart if you held them side by side. B1 V and B3 V are 0.33 apart. B9 V and A0 V, which straddle one of the famous letter boundaries, are 0.49 apart.

The widest stretch that is all one colour runs from O5 V at 39,811 kelvin to B3 V at 19,055. That is a factor of 2.09 in temperature, twenty thousand degrees, and the two ends are 2.05 CIEDE2000 apart. Twenty thousand kelvin of difference, and your eye would call it the same blue.

Almost all the colour lives at the cool end

Walk the whole sequence from O5 V to M6 V, adding up the distance from each class to the next, and the path is 78.58 CIEDE2000 long. Split it at A0 V, which sits almost exactly at the geometric middle of the temperature range.

O5 V to A0 V, 39,811 to 9,550 K11.1% · 8.73 of 78.58, a factor of 4.17 in temperature
A0 V to M6 V, 9,550 to 2,698 K88.9% · 69.85 of 78.58, a factor of 3.54 in temperature

The two halves cover a comparable range of temperature. One of them carries eight times as much colour as the other. If you want to read a star’s temperature off its colour, the cool half is where the instrument has any resolution at all, and the hot half is nearly blind.

This is the same structure that the colour temperature scale has everywhere, and the reason is the same: equal steps in kelvin are not equal steps in colour, because what sets the colour is the position of the spectral peak, and that goes as one over the temperature. Lighting engineers fixed this long ago by working in mireds, the reciprocal. Astronomy never did, which is why the spectral classes are bunched the way they are.

The blue end runs out of blue

Keep heating a star and the colour stops moving. Not slows down, stops. Past a certain point the whole visible band is on the long tail of the Planck curve, the ratio between any two wavelengths is fixed, and the chromaticity has reached an asymptote that no further temperature can improve on.

10,000 K
#CDD9FF · 10.91 from the limit
20,000 K
#ABC1FF · 3.72 from the limit
40,000 K, a hot O star
#9EB8FF · 1.56 from the limit · already invisible
210,000 K, the hottest star known
#96B2FF · 0.26 from the limit
infinitely hot
#94B1FF · the hard stop

The last visible change happens at 28,926 kelvin. Everything hotter than that is within one threshold of an infinitely hot source. WR 102, a Wolf-Rayet star and about the hottest thing with a surface anyone has measured at around 210,000 kelvin, renders 1.30 CIEDE2000 from an ordinary 40,000 kelvin O star. Five times the temperature, no visible difference.

So the common question, what colour is the hottest star, has a slightly deflating answer. It is #94B1FF, a pale periwinkle, and so is every other star above about thirty thousand degrees. There is no bluer blue available, because the sky-blue end of the sRGB cube is not where a thermal source can go. The same ceiling turned up when I measured lightning, where the entire range of real return strokes, fifteen thousand kelvin to thirty thousand, fits inside 0.64 CIEDE2000.

No real star is actually white

A blackbody can render perfectly neutral against a D65 screen. The temperature for it is 6,310 kelvin, and at that temperature a Planck curve lands 4.45 CIEDE2000 from white in my rendering, which is already not zero because D65 is a daylight spectrum rather than a blackbody.

Real stars do worse. The closest any main-sequence class comes to white is G0 V at 4.39, and nothing in the library gets inside the 2.3 threshold. The class nearest 6,310 kelvin, F6 V at 6,281, sits at 6.79 rather than the 4.45 its temperature would predict. A star has absorption lines, a Balmer jump, metal blanketing in the blue, and in the cool classes whole molecular bands of titanium oxide chewing holes in the spectrum. None of that is in a Planck curve.

Measuring the gap directly: I rendered each class next to a blackbody at exactly the same effective temperature. 27 of the 36 classes differ from their own blackbody by more than the visible threshold. The median gap is 4.03 CIEDE2000.

M6 V, measured
#FFC96F · the real spectrum · titanium oxide bands
M6 V as a 2,698 K blackbody
#FFAC59 · 9.76 too orange
A2 V, measured
#B8CBFF · the real spectrum · Balmer jump
A2 V as an 8,913 K blackbody
#D7E0FF · 7.25 too pale

The direction flips across the sequence, which is the interesting part. At the hot end the real star is more saturated than its blackbody, by up to 14.8 chroma units at A2 V, because the Balmer jump removes light from the near ultraviolet and violet in a way that steepens the visible slope. At the cool end the real star is less saturated, by up to 12.4 units at M6 V, because the molecular bands cut into the red as well as the blue and flatten the whole thing out. The textbook approximation does not just have an error bar, it has a systematic error that changes sign halfway down the diagram.

One cross-check, because a result is worth more when two unrelated data chains agree. This site already rendered the sun from the ASTM reference solar spectrum and got #FFF2EF. The Pickles G2 V template, which is an average of other stars entirely and never saw the sun, comes out #FFF4F2. The two are 0.88 CIEDE2000 apart, well under the visible threshold.

What a star is made of matters as much as how hot it is

Spectral type is supposed to be the colour variable and luminosity class the size variable. At the hot end that holds. An A0 dwarf, an A0 giant and an A0 supergiant are all within 0.72 of each other, which is nothing.

At the cool end it falls apart. Take M2, where the library has all three luminosity classes within seven percent of the same effective temperature:

M2 V, a red dwarf, 3,548 K
#FFC58B · C* 45.81
M2 III, a giant, 3,707 K
#FFCF92 · 3.67 away · hotter, yet paler
M2 I, a supergiant, 3,451 K
#FFC475 · 4.90 away

Three stars at essentially one temperature, spread across five CIEDE2000. The giant is the hottest of the three and also the palest, which is the wrong way round if temperature were doing the work. What separates them is surface gravity: a supergiant’s atmosphere is thin and puffy, its molecules survive at a given temperature where a dwarf’s would be pressure-broadened into mush, and the absorption bands land differently. Colour is reading the atmosphere, not just the thermometer.

The stars you can actually name

Rendered from the library template for each star’s published spectral type. These are the colours of the light, not of the star as you see it through five miles of air, which is the next section and changes things considerably.

Spica, B1 III-IV
#9DBAFF · hue 280.6° · the bluest bright star
Rigel, B8 Ia
#B3CEFF · hue 274.2°
Vega, A0 V
#B5CAFF · hue 279.5° · the zero point of the magnitude system
Sirius, A1 V
#B7CBFF · hue 279.7° · 2.04 from Rigel
Deneb, A2 Ia
#C4D5FF · hue 278.3°
Altair, A7 V
#CED9FF · hue 281.6°
Procyon, F5 IV-V
#EBEBFF · hue 291.5°
Polaris, F7 Ib
#FFFBFB · 1.78 from white · genuinely white, below the threshold
The sun and Alpha Centauri A, G2 V
#FFF4F2 · 5.00 from white
Capella, G8 III
#FFE7CB · hue 76.1°
Pollux, K0 III
#FFE6CB · 0.71 from Capella
Arcturus, K1.5 III
#FFE0C0 · hue 73.9°
Aldebaran, K5 III
#FFCD94 · hue 73.5°
Antares, M1.5 Iab
#FFD094 · 1.20 from Aldebaran
Betelgeuse, M2 Iab
#FFC475 · hue 75.4° · the most saturated of the lot
Proxima Centauri, M5.5 V
#FFCB7C · hue 78.4°

Polaris is the one worth pausing on, because it answers a question people ask and the answer is unusually clean. At #FFFBFB, 1.78 CIEDE2000 from pure white, the pole star is the only named star here that a careful observer could not distinguish from white. It is not nearly white or effectively white. It is inside the threshold.

Betelgeuse and Aldebaran are 4.97 apart. Vega and Rigel are 1.82 apart, which is below the threshold, so two stars of quite different spectral type and wildly different size are the same colour. Capella and Pollux are 0.71 apart, which is nothing at all.

Why the sky looks like white dots

Go outside and look up and almost nothing has a colour. A couple of the brightest, Betelgeuse and Antares and Arcturus, will show a tint if you pay attention. The rest are white points. Given that the measured colours above span 53.57 CIEDE2000 from end to end, something is throwing the information away.

Part of it is the familiar one. Below about a hundredth of a candela per square metre your cones stop responding and the rods take over, and rods come in one type, so there is nothing to compare and no colour to be had. But that is the easy half of the answer, and it does not explain why a magnitude 2 star, which is well above any rod-only threshold, still reads as white.

The harder half is that there are not enough photons. I worked out how many a star actually delivers, using the standard calibration that a magnitude zero star puts 3.63 times ten to the minus twelve watts per square metre per nanometre at the top of the V band, a dark-adapted pupil of seven millimetres, and an integration window of a tenth of a second. Through the short-wavelength cone fundamental, which is the channel that carries blue against yellow and therefore the channel star colour lives on:

magnituderoughlyS photons / 100 msPoisson noise
0Vega, Arcturus7623.6%
1Antares, Spica3045.7%
2Polaris, most of the Plough1219.1%
3a faint Plough star4814.4%
4a suburban-sky star1922.9%
5a dark-sky star836.2%
6the naked-eye limit357.4%

At the naked-eye limit the entire blue-sensitive channel of your visual system receives three photons per integration window, across the whole pupil, from the whole star. Colour is a comparison between channels, and a comparison against a count of three carries essentially no information. The number falls to one photon per window at magnitude 7.21.

You can turn that into a limit. Treat the eye as an ideal photon counter and ask at what brightness two stars become statistically separable on the short-against-long cone axis:

  • A sun-like star against a red dwarf, the biggest colour difference in the sky: separable with confidence down to magnitude 2.83, marginally down to 5.22.
  • An A star against a B star, two classes apart: confidently separable only down to magnitude 1.19.
  • An O star against a B star: confidently separable down to magnitude −0.09, which is brighter than every star in the sky except Sirius.

And that is the generous version. It assumes a perfect counter with no neural noise, and it ignores a detail that makes it worse: the very centre of your fovea has almost no short-wavelength cones at all. The central third of a degree is functionally blue-blind, which is why looking straight at a faint star is the worst way to judge its colour and why observers have always said to look slightly to one side.

So the sky is not failing to be colourful. The colour is there, it is just arriving at a rate of a few dozen useful photons per blink, and your retina is doing about as well with it as physics allows.

Looking through the air changes the answer

Everything above is the colour of the light that left the star. By the time it reaches you it has been through the atmosphere, which scatters blue out of the beam exactly the way it does to make the sky blue and to redden a sunset. I ran Vega down the sky, using the standard sea-level Rayleigh optical depth and a clean-site aerosol term, with the usual airmass formula.

Vega overhead, airmass 1.00
#CADBFF · C* 22.08 · hue 275.6°, blue
30° up, airmass 1.99
#E1ECFF · C* 11.03 · half the blue gone
19° up, airmass 3.05
#FBFFFE · C* 1.39 · 1.99 from white, colourless
12° up, airmass 4.71
#FFF5D8 · C* 15.89 · hue 95.5°, now yellow
5° up, airmass 10.31
#FFCC71 · C* 60.20 · hue 81.6°
2° up, airmass 19.43
#FF9B00 · C* 113.48 · hue 70.4°, deep orange

Vega passes through colourless at 19 degrees above the horizon. Above that altitude it is a blue star, below it a yellow one, and at the crossing it is 1.99 from white, inside the threshold. The same star, two colours, and the variable is where you are standing.

The size of this effect is the thing. From the zenith to two degrees up, Vega moves 46.05 CIEDE2000. The entire spectral sequence, the hottest star in the library to the coolest, spans 53.57. Tilting your head downward does 86 percent of what the whole range of stellar temperature does.

This also explains the thing people report and then get told they imagined. Sirius low in the sky appears to flash red and green and blue. It is not imagined and it is not Sirius changing. Near the horizon the light has already been pulled apart by refraction into a tiny vertical spectrum, and atmospheric turbulence then shifts the image around faster than you can track, so different parts of that spectrum arrive at your fovea at different moments. Sirius is bright enough to have photons to spare, which is why it is always Sirius people notice. At magnitude 4 there would be nothing to flash with.

What I would put on the chart instead

The OBAFGKM ladder is a good mnemonic for temperature and a poor one for colour, and the two have been welded together for a century. If I were drawing the chart again I would keep the letters and change the dots:

  • Make the O, B and A dots nearly identical, because they are. The hot half of the sequence is one colour with a slight gradient, and drawing O as a vivid blue next to A as a pale one implies a distinction your eye cannot make.
  • Drop the red dot. The coolest stars are the colour of a dim incandescent bulb, which is to say warm and orange-yellow, and ending the chart in red invents a colour that no star has.
  • Put the gradient where the information is. Between K and M the colour moves fast enough to be useful, and that is the only stretch where a careful eye could read a temperature.
  • Say what the dots are relative to. Every star chart is implicitly rendering against some white, and the choice moves everything. These swatches are against D65 because that is what a screen means by white. Against a flat equal-energy spectrum instead, the sun comes out faintly cool rather than faintly warm, and the whole sequence shifts about ten degrees of hue.

The honest summary of the whole exercise is that stellar colour is a weak instrument pointed at a strong signal. Temperature varies by a factor of fifteen across the main sequence and colour responds to about a third of that range usefully, in a band of hues 203 degrees wide that never once touches red. Astronomers knew this, which is why they measure colour indices with filters and photometers rather than looking, and why the spectral classes were defined by absorption lines in the first place rather than by how blue anything appeared.

Where the numbers came from

Every hex code here is a measured spectrum pushed through the CIE 1931 two-degree colour matching functions at one nanometre resolution and converted to sRGB against the D65 white point, with the result scaled to the brightest in-gamut version of its own chromaticity so that hue and purity survive and brightness is discarded. Nothing is clipped. The CIEDE2000 implementation reproduces all of Sharma’s published test pairs to four decimal places, and the Rayleigh model returns 0.09707 at 550 nanometres against the published 0.0973.

The spectra are the Pickles library, which is a set of composite spectra each averaged from several real stars of that type, covering 1,150 to 25,000 angstroms. Using composites rather than individual stars is the right call for a question about what a spectral class looks like, but it does mean an individual star of a given type will scatter around these values, mostly because of metallicity. The library has metal-rich and metal-weak variants for a dozen classes and the spread between them runs to a few CIEDE2000 at the cool end.

If you want to find out how well you can actually judge a colour without a reference beside it, that is what this site is for. The colour memory game takes the comparison away and makes you hold a target in your head, which is the hard version. Spot the difference shrinks the gap between two colours until you lose it, which is the exercise the 2.3 threshold in this piece describes, and hue sort will tell you whether it is small hue steps or small purity steps that defeat you. There is more in the full set.

For the neighbouring questions, what colour the sun is measures the one star we can see properly, planet colours does the same for everything orbiting it, the colour temperature chart has the Planckian locus this piece keeps comparing against, and the visible spectrum covers why the saturated colours stars cannot reach are mostly outside a screen anyway.