Verzerren Sie eine komplexe Schattierung

Sep 11 2020

Ich versuche, ein Bild in Ti k Z wiederherzustellen . Was unten links ist, ist das Original, und was unten rechts ist, ist meine bisherige Arbeit.

Hier ist eine MWE, die mein derzeitiges Ergebnis generiert:

\documentclass[margin=2mm]{standalone}

\usepackage{tikz}
\usepackage{amsmath}

\usetikzlibrary{decorations.pathreplacing,positioning}

\begin{document}




\pgfdeclareverticalshading{rainbow}{2cm}{color(0mm)=(red); color(4mm)=(orange); color(7mm)=(yellow); color(8mm)=(yellow); color(11mm)=(green); color(14mm)=(blue!50); color(15mm)=(blue!50); color(20mm)=(purple)}
\begin{tikzpicture}[yscale=1.4]
    \footnotesize
    \begin{scope}[
        every node/.style={black,midway,text width=2cm,align=center}
    ]
        \fill [gray!50] (0,0) rectangle (2,1) node{Radio waves};
        \fill [brown!65!black!55] (0,1) rectangle (2,3.5) node{Microwave};
        \fill [brown!60!red!40] (0,3.5) rectangle (2,4.75) node{Thermal infrared};
        \fill [brown!40!red!60] (0,4.75) rectangle (2,5.625) node{Middle infrared};
        \fill [brown!20!red!70] (0,5.625) rectangle (2,6.375) node{Shortwave infrared};
        \fill [red!80] (0,6.375) rectangle (2,6.875) node{Near infrared};
        \shade [shading=rainbow] (0,6.875) rectangle (2,7.5) node{Visible};
        \fill [red!60!blue!30] (0,7.5) rectangle (2,8.75) node{Ultraviolet};
        \fill [red!20!blue!27] (0,8.75) rectangle (2,10.375) node{X-rays};
        \fill [red!20!blue!27] (0,10.375) rectangle (2,12) node{Gamma rays};
    \end{scope}
    
    \draw (0,0) -- (0,12);
    \draw (2,0) -- (2,12);
    \draw [densely dashed] (0,7.75) -- ++(2,0) node[right,text width=1cm]{0.28};
    \foreach \y/\val in {1/$10^6$\\(1 m),3.5/$10^3$\\(1 mm),4.75/5.50,5.625/3.00,6.375/1.50,6.875/0.70,7.5/0.40,8.75/$0.01(10^{-2})$,10.375/} {
        \draw (0,\y) -- ++(2,0) node[right,text width=1cm]{\val};
    }
    \node [anchor=west,text width=1cm] at (2,2.6) {$10^4$};
    \node [anchor=west,text width=1cm] at (2,9.6) {$10^{-4}$};
    \node [anchor=west,text width=1cm] at (2,11.8) {$10^{-8}$};
    \node [rotate=90] at (3.6,6) {Micrometers ($\mu$m)};

    \shade [shading=rainbow] (-2,6.375) rectangle (-1.5,8);
    \draw [densely dashed] (0,6.875) -- (-1.5,6.375) (0,7.5) -- (-1.5,8);
    \begin{scope}[node distance=-1.6pt]
        \node (a) at (-2.5,7.9) {0.400};
        \node (b) [below=of a]  {0.424};
        \node (c) [below=of b]  {0.491};
        \node (d) [below=of c]  {0.575};
        \node (e) [below=of d]  {0.585};
        \node (f) [below=of e]  {0.647};
        \node (g) [below=of f]  {0.710};
    \end{scope}
    \begin{scope}[
        every path/.style={decorate,decoration={brace,mirror}},
        every node/.style={left=1.3cm,anchor=west}
    ]
        \draw (a.west) -- node(v){Violet} (b.west);
        \draw (b.west) -- node{Blue}   (c.west);
        \draw (c.west) -- node{Green}  (d.west);
        \draw (d.west) -- node{Yellow} (e.west);
        \draw (e.west) -- node{Orange} (f.west);
        \draw (f.west) -- node(r){Red}    (g.west);
    \end{scope}
    \draw [decorate,decoration={brace,mirror}] (v.north west) -- node[rotate=90,above]{Visible light} (r.south west);

    \node [anchor=west,text width=3cm] at (-4.7,11.2) {Energy discharges from atomic nuclei};
    \node [anchor=west,text width=3cm] at (-4.7,9.5) {\quad(hard X-ray)\\Medical applications\\\quad(soft X-ray)};
    \node [anchor=west,text width=3cm] at (-4.7,4.1) {Heat lamp};
    \node [anchor=west,text width=3cm] at (-4.7,2.3) {Microwave\\radar};
    \node [anchor=west,text width=3cm] at (-4.7,0.5) {Television\\FM radio\\[6pt]AM radio};
\end{tikzpicture}




\end{document}

Wie Sie sehen, habe ich fast alles so nah gebracht, dass es mir gefällt. Ich kann jedoch nicht herausfinden, wie die Regenbogenschattierung erzeugt werden kann, die sich reibungslos nach außen fächert. Um es zu wiederholen, ich kann die Regenbogenschattierung \pgfdeclareverticalshadingwie gezeigt linear über ausführen, aber ich weiß nicht, wie ich den trapezförmigen Übergangsbereich von der gequetschten Schattierung mit der Bezeichnung "sichtbar" zur längeren Schattierung mit Zahlen auf der linken Seite erstellen kann. Ich weiß, dass es eine kleine Sache ist, aber ich bin nur neugierig, weil ich mich viel auf dieser Website und im PGF-Handbuch umgesehen habe und es nicht herausfinden konnte :)

Lassen Sie mich wissen, ob ich noch etwas anbieten kann, danke!

Antworten

3 vipa Sep 12 2020 at 15:54

Mit einem kleinen Trick.

\documentclass[margin=2mm]{standalone}

\usepackage{tikz}
\usepackage{amsmath}

\usetikzlibrary{decorations.pathreplacing,positioning}

\begin{document}




\pgfdeclareverticalshading{rainbow}{2cm}{color(0mm)=(red); color(4mm)=(orange); color(7mm)=(yellow); color(8mm)=(yellow); color(11mm)=(green); color(14mm)=(blue!50); color(15mm)=(blue!50); color(20mm)=(purple)}
\begin{tikzpicture}[yscale=1.4]
    \footnotesize
    \begin{scope}[
        every node/.style={black,midway,text width=2cm,align=center}
    ]
        \fill [gray!50] (0,0) rectangle (2,1) node{Radio waves};
        \fill [brown!65!black!55] (0,1) rectangle (2,3.5) node{Microwave};
        \fill [brown!60!red!40] (0,3.5) rectangle (2,4.75) node{Thermal infrared};
        \fill [brown!40!red!60] (0,4.75) rectangle (2,5.625) node{Middle infrared};
        \fill [brown!20!red!70] (0,5.625) rectangle (2,6.375) node{Shortwave infrared};
        \fill [red!80] (0,6.375) rectangle (2,6.875) node{Near infrared};
        \shade [shading=rainbow] (0,6.875) rectangle (2,7.5) node{Visible};
        \fill [red!60!blue!30] (0,7.5) rectangle (2,8.75) node{Ultraviolet};
        \fill [red!20!blue!27] (0,8.75) rectangle (2,10.375) node{X-rays};
        \fill [red!20!blue!27] (0,10.375) rectangle (2,12) node{Gamma rays};
    \end{scope}
    
    \draw (0,0) -- (0,12);
    \draw (2,0) -- (2,12);
    \draw [densely dashed] (0,7.75) -- ++(2,0) node[right,text width=1cm]{0.28};
    \foreach \y/\val in {1/$10^6$\\(1 m),3.5/$10^3$\\(1 mm),4.75/5.50,5.625/3.00,6.375/1.50,6.875/0.70,7.5/0.40,8.75/$0.01(10^{-2})$,10.375/} {
        \draw (0,\y) -- ++(2,0) node[right,text width=1cm]{\val};
    }
    \node [anchor=west,text width=1cm] at (2,2.6) {$10^4$};
    \node [anchor=west,text width=1cm] at (2,9.6) {$10^{-4}$};
    \node [anchor=west,text width=1cm] at (2,11.8) {$10^{-8}$};
    \node [rotate=90] at (3.6,6) {Micrometers ($\mu$m)};

    \shade [shading=rainbow] (-2,6.375)coordinate(DLVis) rectangle (-1.5,8) coordinate(URVis);
% trick
    \foreach \hShift[evaluate=\hShift as \vShift using \hShift/3] in {0,0.01,...,1.5} {
    \shade[shading=rainbow] ([shift={(\hShift cm,-\vShift cm)}]URVis) -- +(0.01cm,0) |- ([shift={(\hShift cm,\vShift cm)}]URVis |- DLVis) -- cycle;
    }

    %\draw [densely dashed] (0,6.875) -- (-1.5,6.375) (0,7.5) -- (-1.5,8);
    \begin{scope}[node distance=-1.6pt]
        \node (a) at (-2.5,7.9) {0.400};
        \node (b) [below=of a]  {0.424};
        \node (c) [below=of b]  {0.491};
        \node (d) [below=of c]  {0.575};
        \node (e) [below=of d]  {0.585};
        \node (f) [below=of e]  {0.647};
        \node (g) [below=of f]  {0.710};
    \end{scope}
    \begin{scope}[
        every path/.style={decorate,decoration={brace,mirror}},
        every node/.style={left=1.3cm,anchor=west}
    ]
        \draw (a.west) -- node(v){Violet} (b.west);
        \draw (b.west) -- node{Blue}   (c.west);
        \draw (c.west) -- node{Green}  (d.west);
        \draw (d.west) -- node{Yellow} (e.west);
        \draw (e.west) -- node{Orange} (f.west);
        \draw (f.west) -- node(r){Red}    (g.west);
    \end{scope}
    \draw [decorate,decoration={brace,mirror}] (v.north west) -- node[rotate=90,above]{Visible light} (r.south west);

    \node [anchor=west,text width=3cm] at (-4.7,11.2) {Energy discharges from atomic nuclei};
    \node [anchor=west,text width=3cm] at (-4.7,9.5) {\quad(hard X-ray)\\Medical applications\\\quad(soft X-ray)};
    \node [anchor=west,text width=3cm] at (-4.7,4.1) {Heat lamp};
    \node [anchor=west,text width=3cm] at (-4.7,2.3) {Microwave\\radar};
    \node [anchor=west,text width=3cm] at (-4.7,0.5) {Television\\FM radio\\[6pt]AM radio};
\end{tikzpicture}




\end{document}