Tikz/Pgf – Surfplot mit sanftem Farbübergang

Tikz/Pgf – Surfplot mit sanftem Farbübergang

Ich zeichne ein surf3D-Diagramm in Tikz/Pgf. gnuplotDiese Oberfläche muss auf eine Ebene projiziert werden, was durch Hinzufügen eines weiteren surfDiagramms erreicht werden kann.

Die Sache ist, dass der Übergang zwischen den Farben in beiden surfDiagrammen tatsächlich nicht sehr glatt ist, trotz der Verwendung von

shader=interp

Eine Möglichkeit besteht darin, die Anzahl zu erhöhen. samplesAllerdings wird der Aufbau dadurch langsam und ich kann 75 Samples nicht überschreiten.

Einen Beispielcode finden Sie gleich nebenan

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{tikz}
\usepgfplotslibrary{patchplots}


\begin{document}

\begin{tikzpicture}
    \begin{axis}    [width=\textwidth,
                     height=\textwidth,
                     ultra thick,
                     colorbar,
                     colorbar style={yticklabel style={text width=2.5em,
                                                      align=right,
                                                  /pgf/number format/.cd,
                                                   fixed,
                                                   fixed zerofill,
                                                   precision=1,
                                                   },
                                    },
                     xlabel={$\rho_x=k_xr_x$},
                     ylabel={$\rho_y=k_yr_y$},
                     zlabel={$j_l(\rho)$},
                     3d box,
                     zmax=2.5,
                     xmin=-3, xmax=3,
                 ymin=-3.1, ymax=3.1,
                 ytick={-3, -2, ..., 3},
                 grid=major,
                     grid style={line width=.1pt, draw=gray!30, dashed},
                     x tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                y tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                z tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                    ]
        \addplot3[surf, 
                      shader=interp,
                      mesh/ordering=y varies,
                      domain=-3:3,
                      y domain=-3.1:3.1,
                      ]
             gnuplot {besj0(x**2+y**2)};

         \addplot3[surf,
                  samples=51,
                  shader=interp,
                  mesh/ordering=y varies,
                  domain=-3:3,
                  y domain=-3.1:3.1,
                  point meta=rawz,
                  z filter/.code={\def\pgfmathresult{2.5}},
                  ]
             gnuplot {besj0(x**2+y**2)};
    \end{axis}
\end{tikzpicture}

\end{document}

und das Ergebnis dieses Codes ist das folgende Bild

Bildbeschreibung hier eingeben

Irgendeine Idee, wie man einen sanfteren Übergang von Farbe zu Farbe gestalten kann?

Antwort1

Wenn Ihr Hauptanliegen die Farbübergänge sind, sollten Sie ein Polardiagramm verwenden, da die Funktion nur vom Radius und nicht vom Winkel abhängt. Dann könnten Sie die Abtastungen in radialer Richtung erhöhen, während Sie die Abtastungen in Winkelrichtung vergleichsweise klein lassen.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{patchplots}

\begin{document}  
\begin{tikzpicture}
    \begin{axis}    [width=\textwidth,
                     height=\textwidth,
                     ultra thick,
                     colorbar,
                     colorbar style={yticklabel style={text width=2.5em,
                                                      align=right,
                                                  /pgf/number format/.cd,
                                                   fixed,
                                                   fixed zerofill,
                                                   precision=1,
                                                   },
                                    },
                     xlabel={$\rho_x=k_xr_x$},
                     ylabel={$\rho_y=k_yr_y$},
                     zlabel={$j_l(\rho)$},
                     3d box,
                     zmax=2.5,
                     xmin=-3, xmax=3,
                     ymin=-3.1, ymax=3.1,
                     ytick={-3, -2, ..., 3},
                     grid=major,
                     grid style={line width=.1pt, draw=gray!30, dashed},
                     x tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                     y tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                     z tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    }, 
                    data cs=polar,
                    ]
        \addplot3[surf, samples=37,samples y=101,
                      shader=interp,
                      z buffer=sort,
                      %mesh/ordering=y varies,
                      domain=0:360,
                      y domain=3.1:0,
                      ]
             gnuplot {besj0(y**2)};

        \addplot3[surf, samples=36, samples y=101,
                      shader=interp,
                      %mesh/ordering=y varies,
                      domain=0:360,
                      y domain=0:3.1,
                      point meta=rawz,
                      z filter/.code={\def\pgfmathresult{2.5}},
                      ]
             gnuplot {besj0(y**2)};


    \end{axis}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Als „Nebeneffekt“ verschwinden auch die Wackelbewegungen, da diese beim Aufzeichnen einer rotationssymmetrischen Funktion in kartesischen Koordinaten entstehen.

Und hier ist eine Kombination aus einem kartesischen und einem Polardiagramm.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usepgfplotslibrary{patchplots}

\begin{document}  
\begin{tikzpicture}
    \begin{axis}    [width=\textwidth,
                     height=\textwidth,
                     ultra thick,
                     colorbar,
                     colorbar style={yticklabel style={text width=2.5em,
                                                      align=right,
                                                  /pgf/number format/.cd,
                                                   fixed,
                                                   fixed zerofill,
                                                   precision=1,
                                                   },
                                    },
                     xlabel={$\rho_x=k_xr_x$},
                     ylabel={$\rho_y=k_yr_y$},
                     zlabel={$j_l(\rho)$},
                     3d box,
                     zmax=2.5,
                     xmin=-3, xmax=3,
                     ymin=-3.1, ymax=3.1,
                     ytick={-3, -2, ..., 3},
                     grid=major,
                     grid style={line width=.1pt, draw=gray!30, dashed},
                     x tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                     y tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    },
                     z tick label style={/pgf/number format/.cd,
                                            fixed,
                                            fixed zerofill,
                                            precision=1
                                    }, 
                    ]
        \addplot3[surf, samples=75,
                      shader=interp,
                      mesh/ordering=y varies,
                      domain=-3:3,
                      y domain=-3.1:3.1,
                      ]
             gnuplot {besj0(x**2+y**2)};
        \addplot3[surf, samples=36, samples y=101,
                      shader=interp,
                      %mesh/ordering=y varies,
                      domain=0:360,
                      y domain=0:3.1,
                      point meta=rawz,
                      data cs=polar,
                      z filter/.code={\def\pgfmathresult{2.5}},
                      ]
             gnuplot {besj0(y**2)};


    \end{axis}
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen