4

I am trying to draw the following diagram: enter image description here I have begun drawing the diagram in tikz but I am unsure how to do the electronic excitation and the scale:

\begin{tikzpicture}[scale=1]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (-0.4,0) -- (-1,0);
\draw[-latex] (2,0) -- (2.6,0);
\node[align=center] at (0.8,1.7) {Vibration};
\begin{scope}[xshift=4cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (1.6,0.3) arc (0:90:0.7 and 0.7);
\draw[-latex] (0,-0.3) arc (180:270:0.7 and 0.7);
\node[align=center] at (0.8,1.7) {Rotation};
\end{scope}
\begin{scope}[xshift=-8cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (0.5,0.1);
\fill[blue!20] (1.1,-0.1) rectangle (1.6,0.1);
\draw[densely dashed] (0.8,-0.5) -- (0.8,0.5);
\node[align=center] at (0.8,1.7) {Bond breaking \\ and ionization};
\end{scope}
\end{tikzpicture}

Which produces this image

enter image description here

Edit

After using Marmot's code, I added an axis and now have the following image:

enter image description here

The code is:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{xxcolor}
\tikzset{viewport/.style 2 args={
    x={({cos(-#1)*1cm},{sin(-#1)*sin(#2)*1cm})},
    y={({-sin(-#1)*1cm},{cos(-#1)*sin(#2)*1cm})},
    z={(0,{cos(#2)*1cm})}
}}

% Styles to plot only points that are before or behind the sphere.
\pgfplotsset{only foreground/.style={
    restrict expr to domain={rawx*\CameraX + rawy*\CameraY + rawz*\CameraZ}{-0.05:100},
}}
\pgfplotsset{only background/.style={
    restrict expr to domain={rawx*\CameraX + rawy*\CameraY + rawz*\CameraZ}{-100:0.05}
}}

% Automatically plot transparent lines in background and solid lines in foreground
\def\addFGBGplot[#1]#2;{
    %\addplot3[#1,only background, opacity=0.25] #2;
    \addplot3[#1,only foreground] #2;
}

\newcommand{\ViewAzimuth}{-20}
\newcommand{\ViewElevation}{30}

\pgfmathsetmacro{\CameraX}{sin(\ViewAzimuth)*cos(\ViewElevation)}
\pgfmathsetmacro{\CameraY}{-cos(\ViewAzimuth)*cos(\ViewElevation)}
\pgfmathsetmacro{\CameraZ}{sin(\ViewElevation)}
\newsavebox\mononut
\sbox\mononut{
\begin{tikzpicture}
    % Compute camera unit vector for calculating depth
    \begin{scope}
      \draw[thin,blue!50] (0,0) circle (1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\mononutdashed
\sbox\mononutdashed{
\begin{tikzpicture}
    % Compute camera unit vector for calculating depth
    \begin{scope}
      \draw[thin,blue!50,dashed] (0,0) circle (1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\peanut
\sbox\peanut{
\begin{tikzpicture}
    \begin{scope}
      \draw[thin,blue!50] (45:1) arc(45:315:1);
      \clip (45:1) arc(45:315:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
    \begin{scope}[xshift={1.4cm}]
      \draw[thin,blue!50] (225:1) arc(225:225+270:1);
      \clip (225:1) arc(225:225+270:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{95,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\peanutdashed
\sbox\peanutdashed{
\begin{tikzpicture}
    \begin{scope}
      \draw[thin,blue!50,dashed] (45:1) arc(45:315:1);
      \clip (45:1) arc(45:315:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
    \begin{scope}[xshift={1.4cm}]
      \draw[thin,blue!50,dashed] (225:1) arc(225:225+270:1);
      \clip (225:1) arc(225:225+270:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{95,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}

\begin{document}
\begin{tikzpicture}[scale=1]
\begin{scope}[yshift=-1.8cm]
\draw[densely dashed] (6,-4.5) -- (6,3);
\node at (4.5,-3.75) {Microwave};
\draw[densely dashed] (3,-4.5) -- (3,3);
\draw[densely dashed] (-1.7,-4.5) -- (-1.7,3);
\node at (0.65,-3.75) {Infrared};
\draw[densely dashed] (-2.3,-4.5) -- (-2.3,-1.5) (-2.3,0.5) -- (-2.3,1.1);
\draw[densely dashed]  (-4.5,-4.5) -- (-4.5,3);
\node[rotate=90] at (-2,-3.75) {Visible}; 
\node at (-3.4,-3.75) {Ultraviolet};
\node at (-6.75,-3.75) {X-rays};
\draw[densely dashed] (-9,-4.5) -- (-9,3);
\foreach \x in {-11,-10,...,-1}{
\draw (-1.5*\x-10.5,-3) -- (-1.5*\x-10.5,-2.75);
\node[above,fill=white] at  (1.5*\x+7.5,-2.75) {$10^{\x}$};
}
\draw[latex-latex](-10,-3) -- (7,-3);
\node at (-9.7,-3.75) {$\gamma$-rays};
\node[fill=white] at (-9,-1.7) {Wavelength (m)};
\node at (6.7,-3.75) {Radio};
\draw[latex-latex] (-10,-4.5) -- (7,-4.5);
\end{scope}
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (-0.4,0) -- (-1,0);
\draw[-latex] (2,0) -- (2.6,0);
\node[align=center] at (0.8,1.7) {Vibration};
\begin{scope}[xshift=3.8cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (1.6,0.3) arc (0:90:0.7 and 0.7);
\draw[-latex] (0,-0.3) arc (180:270:0.7 and 0.7);
\node[align=center] at (0.8,1.7) {Rotation};
\end{scope}
\begin{scope}[xshift=-8cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (0.5,0.1);
\fill[blue!20] (1.1,-0.1) rectangle (1.6,0.1);
\draw[densely dashed] (0.8,-0.4) -- (0.75,0) -- (0.85,0) -- (0.8,0.4);
\node[align=center] at (0.8,1.7) {Bond breaking \\ and ionization};
\fill[blue!20] (0,-2) circle (0.3) (1.6,-2) circle (0.3);
\fill[blue!20] (0,-2.1) rectangle (1.6,-1.9);
\draw[-latex] (0.8,-1.3) -- (0.8,-0.7);
\end{scope}
\begin{scope}[xshift=-2.8cm,yshift=-1cm]
\node[scale=0.5] at (-0.5,1.8) {\usebox\mononutdashed};
\node[scale=0.5] at (0.5,1.8) {\usebox\mononut};
\node[scale=0.5] at (-0.5,0.8) {\usebox\mononut};
\node[scale=0.5] at (0.5,0.8) {\usebox\mononutdashed};
\node[scale=0.5] at (0,-0.8) {\usebox\peanut};
\node[scale=0.5] at (0,-1.8) {\usebox\peanutdashed};
\node[align=center,fill=white] at (-1.6,-1.3) {\scriptsize Bonding \\ \scriptsize $\pi$ oribtal};
\node[align=center,fill=white] at (-1.8,1.3) {\scriptsize Antibonding \\ \scriptsize $\pi$ oribtal};
\node[align=center] at (0,2.8) {Electronic\\ excitation};
\draw[-latex] (0,-0.3) -- (0,0.3);
\end{scope}
\end{tikzpicture}
\end{document}

I would like for there to be black outline around the simpler molecules and I would like for the scale numbers to be centered on the 10. How do I do this?

sab hoque
  • 2,627
  • 1
    For a "Please draw this horribly complicated thing for me." request, it really is horribly complicated. Spheres and torus's (tori?) are easy by comparison. – John Kormylo Oct 06 '18 at 12:56
  • That is why I am requesting help, I would not request help for drawing spheres and tori, I would appreciate any form of help that points me in the correct direction – sab hoque Oct 06 '18 at 13:01
  • 1
    See https://tex.stackexchange.com/questions/74168/how-can-i-draw-an-egg-using-tikz – John Kormylo Oct 06 '18 at 13:08
  • 1
    Since you are doing these things with TikZ, I'd recommend this answer. It will allow you to draw the spherical objects and perhaps even the peanut-like shapes. –  Oct 06 '18 at 13:12
  • 1
    isn't your edit actually new question? please ask it as such (with linkt to this original one)! – Zarko Oct 07 '18 at 09:02
  • Sorry I am quite new to texstachexchange will do now – sab hoque Oct 07 '18 at 09:05
  • See: https://tex.stackexchange.com/questions/454204/how-to-manually-center-numbers-and-draw-outline-for-multibody-objects for new question – sab hoque Oct 07 '18 at 09:17

1 Answers1

7

DISCLAIMERS and Warnings:

  1. Almost everything I am going to present here is based Fritz' great answer, where all the conceptual tasks have been accomplished.
  2. This is not a full answer. I did not even look at the tedious part of drawing the axes. However, IMHO this is straightforward and really just tedious. If you have a conceptual question on how to draw this, I will be happy to have a look, but I do not have the time now to do all these tedious things.
  3. The shapes are at best cartoons (but have some similarity to what you seem to want to achieve).
  4. This code takes some while to compile. All the computation is done in the preamble since I am using saveboxes here. If you decide to use it, add the preamble only after you or someone else has done the axes.

Here are code and output.

\documentclass[margin=3.14mm,tikz]{standalone}
\usepackage{pgfplots}
\usepackage{xxcolor}
\pgfplotsset{compat=1.16}


% Style to set TikZ camera angle, like PGFPlots `view`
\tikzset{viewport/.style 2 args={
    x={({cos(-#1)*1cm},{sin(-#1)*sin(#2)*1cm})},
    y={({-sin(-#1)*1cm},{cos(-#1)*sin(#2)*1cm})},
    z={(0,{cos(#2)*1cm})}
}}

% Styles to plot only points that are before or behind the sphere.
\pgfplotsset{only foreground/.style={
    restrict expr to domain={rawx*\CameraX + rawy*\CameraY + rawz*\CameraZ}{-0.05:100},
}}
\pgfplotsset{only background/.style={
    restrict expr to domain={rawx*\CameraX + rawy*\CameraY + rawz*\CameraZ}{-100:0.05}
}}

% Automatically plot transparent lines in background and solid lines in foreground
\def\addFGBGplot[#1]#2;{
    %\addplot3[#1,only background, opacity=0.25] #2;
    \addplot3[#1,only foreground] #2;
}

\newcommand{\ViewAzimuth}{-20}
\newcommand{\ViewElevation}{30}

\pgfmathsetmacro{\CameraX}{sin(\ViewAzimuth)*cos(\ViewElevation)}
\pgfmathsetmacro{\CameraY}{-cos(\ViewAzimuth)*cos(\ViewElevation)}
\pgfmathsetmacro{\CameraZ}{sin(\ViewElevation)}
\newsavebox\mononut
\sbox\mononut{
\begin{tikzpicture}
    % Compute camera unit vector for calculating depth
    \begin{scope}
      \draw[thin,blue!50] (0,0) circle (1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\mononutdashed
\sbox\mononutdashed{
\begin{tikzpicture}
    % Compute camera unit vector for calculating depth
    \begin{scope}
      \draw[thin,blue!50,dashed] (0,0) circle (1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\peanut
\sbox\peanut{
\begin{tikzpicture}
    \begin{scope}
      \draw[thin,blue!50] (45:1) arc(45:315:1);
      \clip (45:1) arc(45:315:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
    \begin{scope}[xshift={1.4cm}]
      \draw[thin,blue!50] (225:1) arc(225:225+270:1);
      \clip (225:1) arc(225:225+270:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{95,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\peanutdashed
\sbox\peanutdashed{
\begin{tikzpicture}
    \begin{scope}
      \draw[thin,blue!50,dashed] (45:1) arc(45:315:1);
      \clip (45:1) arc(45:315:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
    \begin{scope}[xshift={1.4cm}]
      \draw[thin,blue!50,dashed] (225:1) arc(225:225+270:1);
      \clip (225:1) arc(225:225+270:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{95,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\begin{document}
\begin{tikzpicture}[scale=1]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (-0.4,0) -- (-1,0);
\draw[-latex] (2,0) -- (2.6,0);
\node[align=center] at (0.8,1.7) {Vibration};
\begin{scope}[xshift=4cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (1.6,0.3) arc (0:90:0.7 and 0.7);
\draw[-latex] (0,-0.3) arc (180:270:0.7 and 0.7);
\node[align=center] at (0.8,1.7) {Rotation};
\end{scope}
\begin{scope}[xshift=-8cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (0.5,0.1);
\fill[blue!20] (1.1,-0.1) rectangle (1.6,0.1);
\draw[densely dashed] (0.8,-0.5) -- (0.8,0.5);
\node[align=center] at (0.8,1.7) {Bond breaking \\ and ionization};
\end{scope}
\begin{scope}[xshift=-4cm]
\node[scale=0.5] at (-0.5,1.8) {\usebox\mononutdashed};
\node[scale=0.5] at (0.5,1.8) {\usebox\mononut};
\node[scale=0.5] at (-0.5,0.8) {\usebox\mononut};
\node[scale=0.5] at (0.5,0.8) {\usebox\mononutdashed};
\node[scale=0.5] at (0,-0.8) {\usebox\peanut};
\node[scale=0.5] at (0,-1.8) {\usebox\peanutdashed};
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

ADDENDUM: Your lower code with white halos and centered 10s.

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{xxcolor}
\tikzset{viewport/.style 2 args={
    x={({cos(-#1)*1cm},{sin(-#1)*sin(#2)*1cm})},
    y={({-sin(-#1)*1cm},{cos(-#1)*sin(#2)*1cm})},
    z={(0,{cos(#2)*1cm})}
}}

% Styles to plot only points that are before or behind the sphere.
\pgfplotsset{only foreground/.style={
    restrict expr to domain={rawx*\CameraX + rawy*\CameraY + rawz*\CameraZ}{-0.05:100},
}}
\pgfplotsset{only background/.style={
    restrict expr to domain={rawx*\CameraX + rawy*\CameraY + rawz*\CameraZ}{-100:0.05}
}}

% Automatically plot transparent lines in background and solid lines in foreground
\def\addFGBGplot[#1]#2;{
    %\addplot3[#1,only background, opacity=0.25] #2;
    \addplot3[#1,only foreground] #2;
}

\newcommand{\ViewAzimuth}{-20}
\newcommand{\ViewElevation}{30}

\pgfmathsetmacro{\CameraX}{sin(\ViewAzimuth)*cos(\ViewElevation)}
\pgfmathsetmacro{\CameraY}{-cos(\ViewAzimuth)*cos(\ViewElevation)}
\pgfmathsetmacro{\CameraZ}{sin(\ViewElevation)}
\newsavebox\mononut
\sbox\mononut{
\begin{tikzpicture}
    % Compute camera unit vector for calculating depth
    \begin{scope}
      \fill[white] (0,0) circle (1.15); 
      \draw[thin,blue!50] (0,0) circle (1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\mononutdashed
\sbox\mononutdashed{
\begin{tikzpicture}
    % Compute camera unit vector for calculating depth
    \begin{scope}
      \fill[white] (0,0) circle (1.15);
      \draw[thin,blue!50,dashed] (0,0) circle (1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\peanut
\sbox\peanut{
\begin{tikzpicture}
    \begin{scope}
      \fill[white] (45:1.15) arc(45:315:1.15);
      \draw[thin,blue!50] (45:1) arc(45:315:1);
      \clip (45:1) arc(45:315:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
    \begin{scope}[xshift={1.4cm}]
      \fill[white] (225:1.15) arc(225:225+270:1.15);    
      \draw[thin,blue!50] (225:1) arc(225:225+270:1);
      \clip (225:1) arc(225:225+270:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{95,125,160}{
        \addFGBGplot[blue!50,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}
\newsavebox\peanutdashed
\sbox\peanutdashed{
\begin{tikzpicture}
    \begin{scope}
      \fill[white]  (45:1.15) arc(45:315:1.15);
      \clip (45:1) arc(45:315:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{90,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
    \begin{scope}[xshift={1.4cm}]
      \fill[white] (225:1.15) arc(225:225+270:1.15);    
      \draw[thin,blue!50,dashed] (225:1) arc(225:225+270:1);
      \clip (225:1) arc(225:225+270:1);
      \begin{axis}[
            hide axis,
            view={\ViewAzimuth}{\ViewElevation},     % Set view angle
            disabledatascaling,                      % Align PGFPlots coordinates with TikZ
            anchor=origin,                           % Align PGFPlots coordinates with TikZ
            viewport={\ViewAzimuth}{\ViewElevation}, % Align PGFPlots coordinates with TikZ
        ]
        % Plot equator and two longitude lines with occlusion
        \pgfplotsinvokeforeach{30,60,...,150}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1] 
        ({cos(deg(x))*sin(#1)}, {sin(deg(x))*sin(#1)}, {cos(#1)});
        }
        %\addFGBGplot[domain=0:2*pi, samples=100, samples y=1] (0, {sin(deg(x))}, {cos(deg(x))});
        \pgfplotsinvokeforeach{95,125,160}{
        \addFGBGplot[blue!50,dashed,thick,domain=0:2*pi, samples=100, samples y=1]
        ({sin(deg(x))*sin(#1)},{cos(#1)}, {cos(deg(x))*sin(#1)});}
      \end{axis}
    \end{scope}
\end{tikzpicture}
}

\begin{document}
\begin{tikzpicture}[scale=1]
\begin{scope}[yshift=-1.8cm]
\draw[densely dashed] (6,-4.5) -- (6,3);
\node at (4.5,-3.75) {Microwave};
\draw[densely dashed] (3,-4.5) -- (3,3);
\draw[densely dashed] (-1.7,-4.5) -- (-1.7,3);
\node at (0.65,-3.75) {Infrared};
\draw[densely dashed] (-2.3,-4.5) -- (-2.3,-1.5) (-2.3,0.5) -- (-2.3,1.1);
\draw[densely dashed]  (-4.5,-4.5) -- (-4.5,3);
\node[rotate=90] at (-2,-3.75) {Visible}; 
\node at (-3.4,-3.75) {Ultraviolet};
\node at (-6.75,-3.75) {X-rays};
\draw[densely dashed] (-9,-4.5) -- (-9,3);
\foreach \x in {-11,-10,...,-1}{
\draw (-1.5*\x-10.5,-3) -- (-1.5*\x-10.5,-2.75);
\node[above,fill=white] at  (1.5*\x+7.5,-2.75) {$\hphantom{{}^{\x}}10^{\x}$};
}
\draw[latex-latex](-10,-3) -- (7,-3);
\node at (-9.7,-3.75) {$\gamma$-rays};
\node[fill=white] at (-9,-1.7) {Wavelength (m)};
\node at (6.7,-3.75) {Radio};
\draw[latex-latex] (-10,-4.5) -- (7,-4.5);
\end{scope}
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (-0.4,0) -- (-1,0);
\draw[-latex] (2,0) -- (2.6,0);
\node[align=center] at (0.8,1.7) {Vibration};
\begin{scope}[xshift=3.8cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (1.6,0.1);
\draw[-latex] (1.6,0.3) arc (0:90:0.7 and 0.7);
\draw[-latex] (0,-0.3) arc (180:270:0.7 and 0.7);
\node[align=center] at (0.8,1.7) {Rotation};
\end{scope}
\begin{scope}[xshift=-8cm]
\fill[blue!20] (0,0) circle (0.3) (1.6,0) circle (0.3);
\fill[blue!20] (0,-0.1) rectangle (0.5,0.1);
\fill[blue!20] (1.1,-0.1) rectangle (1.6,0.1);
\draw[densely dashed] (0.8,-0.4) -- (0.75,0) -- (0.85,0) -- (0.8,0.4);
\node[align=center] at (0.8,1.7) {Bond breaking \\ and ionization};
\fill[blue!20] (0,-2) circle (0.3) (1.6,-2) circle (0.3);
\fill[blue!20] (0,-2.1) rectangle (1.6,-1.9);
\draw[-latex] (0.8,-1.3) -- (0.8,-0.7);
\end{scope}
\begin{scope}[xshift=-2.8cm,yshift=-1cm]
\node[scale=0.5] at (-0.5,1.8) {\usebox\mononutdashed};
\node[scale=0.5] at (0.5,1.8) {\usebox\mononut};
\node[scale=0.5] at (-0.5,0.8) {\usebox\mononut};
\node[scale=0.5] at (0.5,0.8) {\usebox\mononutdashed};
\node[scale=0.5] at (0,-0.8) {\usebox\peanut};
\node[scale=0.5] at (0,-1.8) {\usebox\peanutdashed};
\node[align=center,fill=white] at (-1.6,-1.3) {\scriptsize Bonding \\ \scriptsize $\pi$ oribtal};
\node[align=center,fill=white] at (-1.8,1.3) {\scriptsize Antibonding \\ \scriptsize $\pi$ oribtal};
\node[align=center] at (0,2.8) {Electronic\\ excitation};
\draw[-latex] (0,-0.3) -- (0,0.3);
\end{scope}
\end{tikzpicture}
\end{document}

enter image description here

  • I will make the axis now and post an answer with the axis (note: I may not include all features of the axis in my final answer) – sab hoque Oct 07 '18 at 06:53
  • Hi @marmot, I added a scale and some other details (see my edit above) but I am unsure how to center the '10s' and how to draw a black outline around the simple molecules. – sab hoque Oct 07 '18 at 08:57
  • @sabhoque I added something along those lines. –  Oct 07 '18 at 14:27