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?

7
  • 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. Oct 6, 2018 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 6, 2018 at 13:01
  • 1
  • 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.
    – user121799
    Oct 6, 2018 at 13:12
  • 1
    isn't your edit actually new question? please ask it as such (with linkt to this original one)!
    – Zarko
    Oct 7, 2018 at 9:02

1 Answer 1

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

3
  • 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 7, 2018 at 6: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 7, 2018 at 8:57
  • @sabhoque I added something along those lines.
    – user121799
    Oct 7, 2018 at 14:27

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .