如何为 3D 绘图添加网格并定义 z 域

如何为 3D 绘图添加网格并定义 z 域

我正在尝试重现以下图表。

在此处输入图片描述

我没有找到方法:

  • 添加水平网格
  • 在 (n,n,0) 处停止绘制线,在下面绘制虚线
  • (奖励)将刻度标记改为圆圈

你知道该怎么做吗?

现在的情况:

在此处输入图片描述

%%%%%%%%%%%%%%%%%% INTRODUCTION %%%%%%%%%%%%%%%%%%
\documentclass[]{standalone}
%%%%%%%%%%%%%%%%%% INPUT %%%%%%%%%%%%%%%%%%
%\input{preamble.tex}
%\input{parameters.tex}
%%%%%%%%%%%%%%%%%% PACKAGE %%%%%%%%%%%%%%%%%%
\usepackage{tgadventor}
\usepackage{sansmath}
\usepackage[usenames, dvipsnames]{xcolor}

\usepackage{tikz} % permet l'intégration des dessins TikZ (les graphiques Geogebra peuvent être exportés au format TikZ)
\usetikzlibrary{%
    matrix,
    arrows,
    arrows.meta,
    bending,
    calc,
    math,
    shapes,
    backgrounds,
    decorations.markings,
    }

\tikzset{%
    graphpgf/.style={%
        font={\sansmath\sffamily\Large}, 
        line cap=round, line join=round, 
        >={Latex[length=3mm]}, 
        x=1.0cm, y=1.0cm, 
        background rectangle/.style={fill=white, shift={(-5pt,-5pt)}},
        show background rectangle,
        inner frame sep=10pt
    }
}

\usepackage{pgfplots} % Permet de tracer de graphiques

\pgfplotsset{compat=1.16} 

\pgfplotsset{%
    /pgfplots/3Dxyz/.style={%
        %%%%%%%%%%  Dimensionnement de l'image  %%%%%%%%%%
        width=15cm,
        height=15cm,
        unit vector ratio=1 1 1.1,
        %%%%%%%%%%  esthétique des axes  %%%%%%%%%%
        xlabel=$\mathrm{x}$,         
        ylabel=$\mathrm{y}$,
        zlabel=$\mathrm{z}$,
        axis lines = center,
        scaled ticks=false, 
        tick label style={/pgf/number format/fixed},
        enlargelimits=false,
        line width=0.4mm,
        every major grid/.append style={black!20, line width=0.35mm,},
        every minor grid/.append style={black!15, line width=0.15mm,},
        every major tick/.append style={
            line width=0.4 mm, 
            %major tick length=7pt, 
            black,
            },
        every minor tick/.append style={line width=0.15mm, minor tick length=4pt, black},
        axis line style = {shorten >=-12.5pt, shorten <=-12.5pt, -{Latex[length=3mm]}},
        grid=major,
    }
}
%%%%%%%%%%%%%%%%%% DOCUMENT %%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}[graphpgf]

%%%%%%%%%%%%%%%%%% Data Table %%%%%%%%%%%%%%%%%%
\begin{axis}[%
    3Dxyz,
    view={145}{25},
    %minor tick num=4,
    %%%     Axe x
    xmin=-4-.3, xmax=4+.3,
    xtick={-10,-9,...,10},
    %minor xtick={-10,...,8},
    domain=-5:5,
    %%%     Axe y
    ymin=-4-.3,ymax=4+.3,
    ytick={-10,-9,...,10},
    %minor ytick={-8,...,8},
    %minor y tick num=4,
    y domain=-5:5,
    %%%     Axe z
    zmin=-1,    zmax=4,
    ztick={-10,-9,...,10},
]%
    \addplot3[%
        color=orange,
        opacity=0.8,
        line width=0.4mm,
        smooth,
        %samples y=1,
        %samples=199,
        ]%
        (1,2,x)
        node[right, pos=0.8] {f}
    ;
    \addplot3[%
        color=blue,
        opacity=0.8,
        line width=0.4mm,
        smooth,
        %samples y=1,
        %samples=199,
        ]%
        (x,x,x)
        node[left, pos=0.8] {g}
    ;
\end{axis}

\end{tikzpicture}
\end{document}

答案1

这使用了这个帖子。它还添加了一个平面,并且 z 轴在 0 下方虚线。这里的许多参数都在轴末端执行的代码中,但可以存储在 pgf 键中。但这可能是一个开始。

\documentclass[]{standalone}
%%%%%%%%%%%%%%%%%% INPUT %%%%%%%%%%%%%%%%%%
%\input{preamble.tex}
%\input{parameters.tex}
%%%%%%%%%%%%%%%%%% PACKAGE %%%%%%%%%%%%%%%%%%
\usepackage{tgadventor}
\usepackage{sansmath}
\usepackage[usenames, dvipsnames]{xcolor}

%\usepackage{tikz} % permet l'intégration des dessins TikZ (les graphiques Geogebra peuvent être exportés au format TikZ)
\usepackage{pgfplots} % Permet de tracer de graphiques

\pgfplotsset{compat=1.16} 
\usetikzlibrary{3d,arrows.meta,backgrounds,calc,shadows.blur}


\tikzset{%
    graphpgf/.style={%
        font={\sansmath\sffamily\Large}, 
        line cap=round, line join=round, 
        >={Latex[length=3mm]}, 
        x=1.0cm, y=1.0cm, 
        background rectangle/.style={fill=white, shift={(-5pt,-5pt)}},
        show background rectangle,
        inner frame sep=10pt
    }
}

\makeatletter
\pgfplotsset{%
    /pgfplots/3Dxyz/.style={%
        %%%%%%%%%%  Dimensionnement de l'image  %%%%%%%%%%
        width=15cm,
        height=15cm,
        unit vector ratio=1 1 1.1,
        %%%%%%%%%%  esthétique des axes  %%%%%%%%%%
        xlabel=$\mathrm{x}$,         
        ylabel=$\mathrm{y}$,
        zlabel=$\mathrm{z}$,
        %axis lines = center,
        hide axis,
        scaled ticks=false, 
        %tick label style={/pgf/number format/fixed},
        enlargelimits=false,
        line width=0.4mm,
        every major grid/.append style={black!20, line width=0.35mm,},
        every minor grid/.append style={black!15, line width=0.15mm,},
        every major tick/.append style={
            line width=0.4 mm, 
            %major tick length=7pt, 
            black,
            },
        every minor tick/.append style={line width=0.15mm, minor tick length=4pt, black},
        axis line style = {shorten >=-12.5pt, shorten <=-12.5pt, 
            -{Latex[length=3mm]},thick},
        every inner x axis line/.append style={red},
        every inner y axis line/.append style={green!60!black},
        every inner z axis line/.append style={blue},
        grid=major,
        set layers=standard,
        execute at end plot visualization={%
        \path (\pgfplots@data@xmax,\pgfplots@data@ymax,0) coordinate(XYpp)
        (\pgfplots@data@xmax,\pgfplots@data@ymin,0) coordinate(XYpm)
        --(\pgfplots@data@xmin,\pgfplots@data@ymin,0) coordinate(XYmm)
        --(\pgfplots@data@xmin,\pgfplots@data@ymax,0) coordinate(XYmp);
        \path (0.5*\pgfplots@data@xmin+0.5*\pgfplots@data@xmax,%
            0.5*\pgfplots@data@ymin+0.5*\pgfplots@data@ymax,0) coordinate
            (XY-O);
        \begin{pgfonlayer}{axis background}
         \draw[dashed,/pgfplots/every inner z axis line,-]
          (0,0,\pgfplots@data@zmin) -- (0,0,0);
        \end{pgfonlayer}        
        \begin{scope}[canvas is xy plane at z=0]
         \begin{pgfonlayer}{axis background}
         \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
         \path let \p1=($(XYpp)-(XYmp)$),\p2=($(XYpp)-(XYmp)$),
            \n1={0.9*veclen(\x1,\y1)},\n2={0.9*veclen(\x2,\y2)},
            \n3={0.025*\n1+0.025*\n2} in
           (XY-O)
            node[transform shape,opacity=0.2,
                minimum width=\n1,
                minimum height=\n2,
                blur shadow={shadow xshift=0pt,shadow yshift=0pt,
                shadow blur radius=\n3,
                shadow blur steps=25}]{};
         \end{pgfonlayer}       
        \end{scope}
        \begin{pgfonlayer}{axis lines}
         \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
         \pgfmathsetmacro{\myxmax}{\pgfplots@data@xmax}
         \pgfmathsetmacro{\myxmin}{\pgfplots@data@xmin}
         \pgfmathsetmacro{\myymax}{\pgfplots@data@ymax}
         \pgfmathsetmacro{\myymin}{\pgfplots@data@ymin}
         \pgfmathsetmacro{\myzmax}{\pgfplots@data@zmax}
         \pgfmathtruncatemacro{\intxmax}{int(\pgfplots@[email protected])}
         \pgfmathtruncatemacro{\intxmin}{int(\pgfplots@data@xmin+0.1)}
         \pgfmathtruncatemacro{\intymax}{int(\pgfplots@[email protected])}
         \pgfmathtruncatemacro{\intymin}{int(\pgfplots@data@ymin+0.1)}
         \pgfmathtruncatemacro{\intzmax}{int(\pgfplots@[email protected])}
         \pgfkeys{/pgf/fpu=false}%
         \draw[->,/pgfplots/.cd,every inner x axis line]
          (\myxmin,0,0) --  (\myxmax,0,0);
         \foreach \x in {\intxmin,...,\intxmax}
          {\edef\temp{\noexpand\path (\x,\myymin,0) edge[dotted] (\x,\myymax,0)
          (\x,0,0) node[label={[/pgfplots/every inner x axis line]above left:{$\x$}},
            circle,inner sep=1.2pt,fill,/pgfplots/every inner x axis line]{};}
          \temp}
         \draw[->,/pgfplots/.cd,every inner y axis line]
          (0,\myymin,0) --  (0,\myymax,0);
         \foreach \y in {\intymin,...,\intymax}
          {\edef\temp{\noexpand\path (\myxmin,\y,0) edge[dotted] (\myxmax,\y,0)
          (0,\y,0) node[label={[/pgfplots/every inner y axis line]above right:{$\y$}},
            circle,inner sep=1.2pt,fill,/pgfplots/every inner y axis line]{};}
          \temp}
         \draw[->,/pgfplots/.cd,every inner z axis line]
          (0,0,0) --  (0,0,\myzmax);
         \foreach \z in {0,...,\intzmax}
          {\edef\temp{\noexpand\path 
          (0,0,\z) node[label={[/pgfplots/every inner z axis line]above left:{$\z$}},
            circle,inner sep=1.2pt,fill,/pgfplots/every inner z axis line]{};}
          \temp}
        \end{pgfonlayer}
        }
    }
}
\makeatother
\def\addFGBGplot[#1]#2;{
    \begin{pgfonlayer}{axis background}
      \addplot3[#1,only background] #2;
    \end{pgfonlayer} 
    \begin{pgfonlayer}{main}
      \addplot3[#1,only foreground] #2;
    \end{pgfonlayer} 
}
% Styles to plot only points that are before or behind the sphere.
\pgfplotsset{only foreground/.style={%
    restrict expr to domain={rawz}{-0.05:100},
}}
\pgfplotsset{only background/.style={dashed,%
    restrict expr to domain={rawz}{-100:0.05}
}}
%%%%%%%%%%%%%%%%%% DOCUMENT %%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}%[graphpgf]

%%%%%%%%%%%%%%%%%% Data Table %%%%%%%%%%%%%%%%%%
\begin{axis}[%
    3Dxyz,
    view={145}{25},
    %minor tick num=4,
    %%%     Axe x
    xmin=-4-.3, xmax=4+.3,
    xtick={-10,-9,...,10},
    %minor xtick={-10,...,8},
    domain=-5:5,
    %%%     Axe y
    ymin=-4-.3,ymax=4+.3,
    ytick={-10,-9,...,10},
    %minor ytick={-8,...,8},
    %minor y tick num=4,
    y domain=-5:5,
    %%%     Axe z
    zmin=-1,    zmax=4,
    ztick={-10,-9,...,10},
]%

    \addFGBGplot[%
        color=orange,
        line width=0.4mm,
        samples y=1,
        samples=201,
        ]%
        (1,2,x);
    \addFGBGplot[%
        color=cyan,
        line width=0.4mm,
        samples y=1,
        samples=201,
        ]%
        (x,x,x);
\end{axis}

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容