# Black body plots

Plot of black body formulas: Rayleigh-Jeans, Wien and Planck. Inspiration from Wikipedia.

Find other black body diagrams via the “black body” tag: black body color gradient, cavity model, Plank oscillators. For more figures related to thermodynamics, see the “thermodynamics” category.

Including Wien's displacement law:
Comparing black body colors in a log-log plot:
Comparing Planck to Rayleigh-Jeans & Wien in a log-log plot for T = 300 K:
For T = 3000 K:
Comparison for several temperatures:
Redshift of the cosmic microwave background (CMB) from 3000K to ~3K due to the expansion of the universe:
Small variations of the CMB temperature (note real variation are actually on the order of ΔT ~ 20 𝜇K after subtracting the dipole ΔT ~ 3 mK due to the Doppler effect of our motion relative to the CMB):

Edit and compile if you like:

% Author: Izaak Neutelings (March 2019)
\documentclass[border=3pt,tikz]{standalone}
\tikzset{>=latex} % for LaTeX arrow head
\usepackage{pgfplots} % for the axis environment
\pgfplotsset{
compat=1.13, % TikZ coordinates <-> axes coordinates
/pgf/number format/1000 sep={},
legend image code/.code={
\draw[mark repeat=2,mark phase=2]
plot coordinates {(0cm,0cm) (0.22cm,0cm) (0.44cm,0cm)};%
}
}
\usepackage{siunitx}

% redraw axis on top
\makeatletter \newcommand{\pgfplotsdrawaxis}{\pgfplots@draw@axis} \makeatother
\pgfplotsset{axis line on top/.style={after end axis/.append code={\pgfplotsdrawaxis}}
}

% CUSTOM COLORS
% See https://tikz.net/blackbody_color/
\definecolor{1000K}{rgb}{1,0.0337,0}
\definecolor{2000K}{rgb}{1,0.2647,0.0033}
\definecolor{3000K}{rgb}{1,0.4870,0.1411}
\definecolor{4000K}{rgb}{1,0.6636,0.3583}
\definecolor{5000K}{rgb}{1,0.7992,0.6045}
\definecolor{6000K}{rgb}{1,0.9019,0.8473}
\definecolor{8000K}{rgb}{0.7874,0.8187,1}
\definecolor{10000K}{rgb}{0.6268,0.7039,1}
color(0bp)=(red); color(25bp)=(red); color(35bp)=(yellow);
color(45bp)=(green); color(55bp)=(cyan); color(65bp)=(blue);
color(75bp)=(violet); color(100bp)=(violet)
}
\colorlet{myred}{red!70!black}
\colorlet{mygreen}{green!70!black}
\colorlet{mydarkgreen}{green!55!black}

% PLANCK & RAYLEIGH-JEANS
% 2hc^2/lambda^5 = 2 * 6.62607015e-34 * 299792458^2
%                = 1.191042972e-16
%    W.m -> kW.nm: 1.191042972e26
%  hc/k lambda T = 6.62607015e-34*299792458/(1.38064852e-23)
%                = 0.01438777378
%         m -> nm: 0.01438777378e9
% 2ckT/lambda^4  = 2 * 299792458 * 1.38064852e-23
%                = 8.278160269e-15
%    W.m -> kW.nm: 8.278160269e18
\pgfmathdeclarefunction{planck}{2}{%
\pgfmathparse{1.191042972e26/(#1^5)/(exp(0.01439e9/(#1*#2))-1)}%
}
\pgfmathdeclarefunction{rayleighjeans}{2}{%
\pgfmathparse{8.278160269e18*#2/(#1^4)}%
}
\pgfmathdeclarefunction{wien}{2}{%
\pgfmathparse{1.191042972e26/(#1^5)*exp(-0.01439e9/(#1*#2))}%
}
\pgfmathdeclarefunction{lampeak}{1}{% % Wien's displacement law
\pgfmathparse{2.898e6/#1}%
}

\begin{document}

% BLACK BODY - 3000, 4000, 5000K
\begin{tikzpicture}
\message{^^JBlack body}
\def\N{60}
\def\xmax{3100}
\def\ymax{1.36e10}
\def\tick#1#2{\draw[thick] (#1+.01*\ymax) -- (#1-.01*\ymax) node[below=-.5pt,scale=0.75] {#2};}
\begin{axis}[
every axis plot/.style={
mark=none,samples=\N,domain=5:\xmax,smooth},
xmin=(-.05*\xmax), xmax=(1.05*\xmax),
ymin=(-.08*\ymax), ymax=(1.08*\ymax),
restrict y to domain=0:\ymax,
axis lines=middle,
axis line style=thick,
%enlargelimits=upper, % extend the axes a bit to the right and top
tick style={black,thick},
ticklabel style={scale=0.8},
%xtick style={draw=none},xticklabels=none,
max space between ticks=26,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=-1pt,font=\small},
ylabel style={at={(rel axis cs:-0.11,0.5)},rotate=90},
width=9cm, height=7cm,
%clip=false
tick scale binop=\times,
every y tick scale label/.style={at={(rel axis cs:0,1)},anchor=south}]
]

% RAINBOW
\node[above=-1pt,scale=0.8] at (200,\ymax) {\strut UV}; % 10 - 400 nm
\node[above=-1pt,scale=0.8] at (570,\ymax) {\strut optical}; % 380 - 740 nm
\node[above=-1pt,scale=0.8] at (920,\ymax) {\strut IR}; % 740 - 1050 nm

% PLANCK

%% MAXIMUM (Wien's displacement law)
%  ({lampeak(T)},{planck(lampeak(T),T)});

% LABELS
\node[above=0pt,scale=0.75,red] at (1150,{planck(1150,3000)}) {\SI{3000}{K}};
\node[above right=-1pt,scale=0.75,orange!80!black] at (740,{planck(740,4000)}) {\SI{4000}{K}};
\node[above right=-1pt,scale=0.75,blue] at (800,{planck(800,5000)}) {\SI{5000}{K}};
\node[above right=-1pt,scale=0.75,blue] at (1500,{rayleighjeans(1500,5000)}) {\SI{5000}{K} Rayleigh-Jeans};

%% TICKS
%\tick{500,0}{500}
%\tick{1000,0}{1000}
%\tick{1500,0}{1500}
%\tick{2000,0}{2000}
%\tick{2500,0}{2500}
%\tick{3000,0}{3000}

\end{axis}
\end{tikzpicture}

% BLACK BODY - 3000, 4000, 5000K, Wien's displacement law
\begin{tikzpicture}
\message{^^JBlack body, Wien's displacement law}
\def\N{60}
\def\xmax{3100}
\def\ymax{1.36e10}
\def\tick#1#2{\draw[thick] (#1+.01*\ymax) -- (#1-.01*\ymax) node[below=-.5pt,scale=0.75] {#2};}
\begin{axis}[
every axis plot/.style={
very thick,mark=none,samples=\N,domain=5:\xmax,smooth},
xmin=(-.05*\xmax), xmax=(1.05*\xmax),
ymin=(-.08*\ymax), ymax=(1.08*\ymax),
restrict y to domain=0:\ymax,
axis lines=middle,
axis line style=thick,
%enlargelimits=upper, % extend the axes a bit to the right and top
tick style={black,thick},
ticklabel style={scale=0.8},
%xtick style={draw=none},xticklabels=none,
max space between ticks=26,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=-1pt,font=\small},
ylabel style={at={(rel axis cs:-0.11,0.5)},rotate=90},
width=9cm, height=7cm,
%clip=false
tick scale binop=\times,
every y tick scale label/.style={at={(rel axis cs:0,1)},anchor=south}]
]

% RAINBOW
\node[above=-1pt,scale=0.8] at (200,\ymax) {\strut UV}; % 10 - 400 nm
\node[above=-1pt,scale=0.8] at (570,\ymax) {\strut optical}; % 380 - 740 nm
\node[above=-1pt,scale=0.8] at (920,\ymax) {\strut IR}; % 740 - 1050 nm

% PLANCK

% MAXIMUM (Wien's displacement law)
({lampeak(T)},{planck(lampeak(T),T)});
({lampeak(T)},{planck(lampeak(T),T)});
\fill[mydarkgreen!80!black] ({lampeak(3000)},{planck(lampeak(3000),3000)}) circle(1.5pt);
\fill[mydarkgreen!80!black] ({lampeak(4000)},{planck(lampeak(4000),4000)}) circle(1.5pt);
\fill[mydarkgreen!80!black] ({lampeak(5000)},{planck(lampeak(5000),5000)}) circle(1.5pt);

% LABELS
\node[above=0pt,scale=0.75,red] at (1150,{planck(1150,3000)}) {\SI{3000}{K}};
\node[above right=-1pt,scale=0.75,orange!80!black] at (740,{planck(740,4000)}) {\SI{4000}{K}};
\node[above right=-1pt,scale=0.75,blue] at (800,{planck(800,5000)}) {\SI{5000}{K}};
\node[above right=-1pt,scale=0.75,blue] at (1500,{rayleighjeans(1500,5000)}) {\SI{5000}{K} Rayleigh-Jeans};

\end{axis}
\end{tikzpicture}

% BLACK BODY - 3000, 4000, 5000K
\begin{tikzpicture}
\message{^^JBlack body}
\def\N{60}
\def\xmax{3100}
\def\ymax{1.43e10}
\def\tick#1#2{\draw[thick] (#1+.01*\ymax) -- (#1-.01*\ymax) node[below=-.5pt,scale=0.75] {#2};}
\begin{axis}[
every axis plot/.style={
mark=none,samples=\N,domain=5:\xmax,smooth},
xmin=(0), xmax=(\xmax),
ymin=(0), ymax=(\ymax),
restrict y to domain=0:\ymax,
%axis lines=middle,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={below=-1pt,font=\small},
ylabel style={above=-1pt},
width=9cm, height=7cm,
tick scale binop=\times,
every y tick scale label/.style={at={(rel axis cs:0,1)},anchor=south}]
]

% RAINBOW
\draw[dashed] (380,{planck(380,5000)}) -- (380,\ymax);
\draw[dashed] (740,{planck(740,5000)}) -- (740,\ymax);
\begin{scope}
\clip[variable=\x,domain=200:1000,samples=40]
plot(\x,{planck(\x,5000)}) |- (200,0) -- cycle;
\end{scope}

% PLANCK

% MAXIMUM (Wien's displacement law)
({lampeak(T)},{planck(lampeak(T),T)});
({lampeak(T)},{planck(lampeak(T),T)});
\fill[mydarkgreen!80!black] ({lampeak(3000)},{planck(lampeak(3000),3000)}) circle(1.5pt);
\fill[mydarkgreen!80!black] ({lampeak(4000)},{planck(lampeak(4000),4000)}) circle(1.5pt);
\fill[mydarkgreen!80!black] ({lampeak(5000)},{planck(lampeak(5000),5000)}) circle(1.5pt);

% LABELS
\node[above=0pt,scale=0.75,red]
at (1150,{planck(1150,3000)}) {\SI{3000}{K}};
\node[above right=-1pt,scale=0.75,orange!80!black]
at (740,{planck(740,4000)}) {\SI{4000}{K}};
\node[above right=-1pt,scale=0.75,blue]
at (800,{planck(800,5000)}) {\SI{5000}{K}};
\node[above right=-1pt,scale=0.75,blue]
at (1500,{rayleighjeans(1500,5000)}) {\SI{5000}{K} Rayleigh-Jeans};

% LABELS
\node[below=2pt,scale=0.8] at (200,\ymax) {\strut UV}; % 10 - 400 nm
\node[below=2pt,scale=0.8] at (562,\ymax) {\strut optical}; % 380 - 740 nm
\node[below=2pt,scale=0.8] at (920,\ymax) {\strut IR}; % 740 - 1050 nm

\end{axis}
\end{tikzpicture}

% BLACK BODY LOG-LOG - colors
% See https://tikz.net/blackbody_color/
\begin{tikzpicture} %[scale=2]
\message{^^JBlack body colors}
\def\N{40}
\def\xmin{35}
\def\xmax{1.7e5}
\def\ymin{1e2}
\def\ymax{2e12}
\begin{loglogaxis}[
every axis plot post/.append style={
very thick,mark=none,domain=\xmin:\xmax,samples=\N,smooth},
xmin=\xmin, xmax=(1.01*\xmax),
ymin=\ymin, ymax=\ymax,
restrict y to domain=0.1*\ymin:\ymax,
log basis y=10,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
max space between ticks=23,
yminorticks=false,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=8pt},
ylabel style={above=-2pt},
legend style={at={(0.98,0.95)},anchor=north east,draw=none,fill=none,
nodes={scale=0.7, transform shape}},
legend cell align={left},
width=8cm, height=6cm,
axis line on top
]

% RAINBOW

% PLANCK

% LEGENDS

\end{loglogaxis}
\end{tikzpicture}

% BLACK BODY LOG-LOG - Rayleigh-Jeans / Wien, 300K
\begin{tikzpicture}
\message{^^JRayleigh-Jeans / Wien, 300K}
\def\N{40}
\def\xmin{1.5e3}
\def\xmax{2e6}
\def\ymin{5e-4}
\def\ymax{3e4}
\begin{loglogaxis}[
every axis plot/.style={
very thick,mark=none,domain=\xmin:\xmax,samples=\N,smooth},
xmin=\xmin, xmax=(1.01*\xmax),
ymin=\ymin, ymax=\ymax,
restrict y to domain=0.1*\ymin:\ymax,
log basis y=10,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
%ticks=none,
max space between ticks=23,
yminorticks=false,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=8pt},
ylabel style={above=-2pt},
width=8cm, height=6cm,
legend style={at={(0.14,0.15)},anchor=south west,draw=none,fill=none,font=\small},
legend cell align={left},
axis line on top
]

% PLANCK

% LEGENDS
\node[scale=1] at (0.18*\xmax,0.01*\ymax) {$T=\SI{300}{K}$};

\end{loglogaxis}
\end{tikzpicture}

% BLACK BODY LOG-LOG - Rayleigh-Jeans / Wien, 3000K
\begin{tikzpicture}
\message{^^JRayleigh-Jeans / Wien, 3000K}
\def\N{40}
\def\xmin{1.5e2}
\def\xmax{2e5}
\def\ymin{5e1}
\def\ymax{4e9}
\begin{loglogaxis}[
every axis plot/.style={
very thick,mark=none,domain=\xmin:\xmax,samples=\N,smooth},
xmin=\xmin, xmax=(1.01*\xmax),
ymin=\ymin, ymax=\ymax,
restrict y to domain=0.1*\ymin:\ymax,
log basis y=10,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
%ticks=none,
max space between ticks=23,
yminorticks=false,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=8pt},
ylabel style={above=-2pt},
width=8cm, height=6cm,
legend style={at={(0.14,0.15)},anchor=south west,draw=none,fill=none,font=\small},
legend cell align={left},
axis line on top
]

% RAINBOW

% PLANCK

% LEGENDS
\node[scale=1] at (0.17*\xmax,0.01*\ymax) {$T=\SI{3000}{K}$};

\end{loglogaxis}
\end{tikzpicture}

% BLACK BODY LOG-LOG - Rayleigh-Jeans / Wien
\begin{tikzpicture}
\message{^^JRayleigh-Jeans / Wien}
\def\N{40}
\def\xmin{3e2}
\def\xmax{2e6}
\def\ymin{1e-3}
\def\ymax{1e7}
\begin{loglogaxis}[
every axis plot/.style={
very thick,mark=none,domain=\xmin:\xmax,samples=\N,smooth},
xmin=\xmin, xmax=(1.01*\xmax),
ymin=\ymin, ymax=\ymax,
restrict y to domain=0.1*\ymin:\ymax,
log basis y=10,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
%ticks=none,
max space between ticks=23,
yminorticks=false,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=9pt},
ylabel style={above=-2pt},
width=8cm, height=6cm,
axis line on top,
legend style={at={(0.65,0.9)},anchor=north west,draw=none,fill=none,font=\small}%,
%legend cell align={left},
]

% RAINBOW

% PLANCK

% LEGENDS

\end{loglogaxis}
\end{tikzpicture}

% BLACK BODY LOG-LOG - CMB redshift
\begin{tikzpicture}
\message{^^JCMB redshift}
\def\N{60}
\def\xmin{5e1}
\def\xmax{2e8}
\def\ymin{1e-10}
\def\ymax{1e11}
\begin{loglogaxis}[
every axis plot/.style={
very thick,mark=none,samples=\N,smooth},
xmin=\xmin, xmax=(1.01*\xmax),
ymin=\ymin, ymax=\ymax,
restrict y to domain=0.1*\ymin:\ymax,
log basis y=10,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
%ticks=none,
max space between ticks=23,
yminorticks=false,
variable=x,
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=9pt},
ylabel style={above=-2pt},
width=8cm, height=6cm,
axis line on top
]

% BANDS
% See https://tikz.net/electromagnetic_spectrum/
\fill[violet!80!black!5] (\xmin,\ymin) rectangle (380,\ymax); % ultraviolet
\fill[red!80!black!4] (740,\ymin) rectangle (1e6,\ymax); % infrared
\fill[orange!80!black!4] (1e6,\ymin) rectangle (1e8,\ymax); % microwave
\fill[green!80!black!4] (1e8,\ymin) rectangle (\xmax,\ymax); % radio
\node[below=3,scale=0.7,violet!50!black] at ({\xmin*10^(log10(380/\xmin)/2)},\ymax) {UV};
\node[below=3,scale=0.7,red!50!black] at ({740*10^(log10(1e6/740)/2)},\ymax) {infrared};
\node[below=3,scale=0.7,orange!60!black] at ({1e6*10},\ymax) {microwave};

% PLANCK
\addplot[domain=1e5:\xmax,red]     {rayleighjeans(x,3000)}; % prevent rounding errors in tail

% LABELS
\node[above right=-1,red] at (1e4,{planck(1e4,3000)}) {\SI{3000}{K}};
\node[anchor=-70,mygreen] at (1e6,{planck(1e6,2.725)}) {\SI{2.725}{K}};

% ARROW
\draw[->,line width=2,myred] (7e3,1e2) --++ (-42:17mm)
node[pos=0.38,above,sloped,scale=0.95] {redshift}
node[pos=0.38,below,sloped,scale=0.90] {$z\sim1100$};

\end{loglogaxis}
\end{tikzpicture}

% BLACK BODY LOG-LOG - CMB temperature variations
% https://en.wikipedia.org/wiki/Cosmic_microwave_background#Relationship_to_the_Big_Bang
% T ~ 2.725 K with anisotropic variations of ~ 18 uK = 0.000018 K
\begin{tikzpicture}
\message{^^JCMB temperature variations}
\def\N{40}
\def\xmin{3.2e5}
\def\xmax{8e6}
\def\ymin{5e-9}
\def\ymax{1e-6}
\begin{loglogaxis}[
every axis plot post/.append style={
very thick,mark=none,samples=\N,domain=\xmin:\xmax,smooth},
xmin=\xmin, xmax=(1.01*\xmax),
ymin=\ymin, ymax=\ymax,
restrict y to domain=0.1*\ymin:\ymax,
log basis y=10,
axis line style=thick,
tick style={black,thick},
ticklabel style={scale=0.8},
xtick={5e5,1e6,2e6,5e6},
minor xtick={4e5,6e5,7e5,8e5,9e5,3e6,4e6,6e6},
log number format code/.code={
\pgfkeys{/pgf/fpu}
\pgfmathparse{exp(\tick)}
\pgfmathprintnumber[sci,sci zerofill,precision=0]{\pgfmathresult}
\pgfkeys{/pgf/fpu=false}
},
xlabel={Wavelength $\lambda$ [nm]},
ylabel={Power $P$ [kW/sr\,m$^2$\,nm]},
xlabel style={at={(rel axis cs:0.5,0)},below=9pt},
ylabel style={above=-2pt},
width=8cm, height=6cm,
axis line on top,
legend style={
at={(0.24,0.3)},anchor=south west,draw=none,fill=none,font=\small},
legend cell align={left},
legend image code/.code={
\draw[mark repeat=2,mark phase=2]
plot coordinates {(0cm,0cm) (0.28cm,0cm) (0.56cm,0cm)};%
}
]

% PLANCK
\addplot[red,dashed]  {planck(x,2.750)}; % draw over 2.725

% LEGENDS
\end{document}