3차원 플롯을 위한 Tufte 스타일 범위 프레임

3차원 플롯을 위한 Tufte 스타일 범위 프레임

이 질문은 후속 조치입니다.이 질문, 이를 통해 2차원 사례를 해결할 수 있었습니다.

예를 들어 이 플롯

사인

다음 코드로 생성됩니다.

\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}
\def\axisdefaultwidth{360pt}
\pgfkeys{/pgfplots/x axis shift down/.style={
  x axis line style={yshift=-#1},
  xtick style={yshift=-#1},
  xticklabel shift={#1}}}
\pgfkeys{/pgfplots/y axis shift left/.style={
  y axis line style={xshift=-#1},
  ytick style={xshift=-#1},
  yticklabel shift={#1}}}

\pgfplotsset{
  every axis/.append style={thick},tick style={thick,black},
  range frame/.style={
    tick align=outside,
    scaled ticks=false,
    axis lines*=left,
    enlargelimits=false,
    x axis shift down=10pt,
    y axis shift left=10pt,
    line cap=round,
    clip=false,
    after end axis/.code={
       \draw (xticklabel* cs:0,10pt) -- ++(0,-\pgfkeysvalueof{/pgfplots/major tick length});
       \draw (xticklabel* cs:1,10pt) -- ++(0,-\pgfkeysvalueof{/pgfplots/major tick length});
       \draw (yticklabel* cs:0,10pt) -- ++(-\pgfkeysvalueof{/pgfplots/major tick length},0);
       \draw (yticklabel* cs:1,10pt) -- ++(-\pgfkeysvalueof{/pgfplots/major tick length},0);
    }
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[range frame,xtick={0,90,180,270,360}]
    \addplot[domain=0:360,samples=201] {sin(x)};
  \end{axis}
\end{tikzpicture}
\end{document}

비슷하게

PDF

다음에 의해 생성됩니다:

\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\def\axisdefaultwidth{360pt}
\pgfkeys{/pgfplots/x axis shift down/.style={
  x axis line style={yshift=-#1},
  xtick style={yshift=-#1},
  xticklabel shift={#1}}}
\pgfkeys{/pgfplots/y axis shift left/.style={
  y axis line style={xshift=-#1},
  ytick style={xshift=-#1},
  yticklabel shift={#1}}}

\pgfplotsset{
  every axis/.append style={thick},tick style={thick,black},
  range frame/.style={
    tick align=outside,
    scaled ticks=false,
    axis lines*=left,
    enlargelimits=false,
    x axis shift down=10pt,
    y axis shift left=10pt,
    line cap=round,
    clip=false,
    after end axis/.code={
       \draw (xticklabel* cs:0,10pt) -- ++(0,-\pgfkeysvalueof{/pgfplots/major tick length});
       \draw (xticklabel* cs:1,10pt) -- ++(0,-\pgfkeysvalueof{/pgfplots/major tick length});
       \draw (yticklabel* cs:0,10pt) -- ++(-\pgfkeysvalueof{/pgfplots/major tick length},0);
       \draw (yticklabel* cs:1,10pt) -- ++(-\pgfkeysvalueof{/pgfplots/major tick length},0);
    }
  }
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[range frame,ytick={0},extra y ticks={0.398942},extra y tick labels={$\frac{1}{\sqrt{2π}}$},xtick=\empty,extra x ticks={-3,-2,-1,1,2,3},extra x tick labels={$-3σ$,$-2σ$,$-σ$,$σ$,$2σ$,$3σ$}]
    \addplot[domain=-5:5,samples=201,name path=A] {exp(-x^2/2)/sqrt(2*pi)};
    \path[name path=B] (axis cs:\pgfkeysvalueof{/pgfplots/xmin},0) -- (axis cs:\pgfkeysvalueof{/pgfplots/xmax},0);
    \addplot[black!30] fill between[of=A and B,soft clip={(axis cs:-3,0) rectangle (axis cs:3,1)}];
    \addplot[black!20] fill between[of=A and B,soft clip={(axis cs:-2,0) rectangle (axis cs:2,1)}];
    \addplot[black!10] fill between[of=A and B,soft clip={(axis cs:-1,0) rectangle (axis cs:1,1)}];
  \end{axis}
\end{tikzpicture}
\end{document}

이제 3차원 플롯에서 동일한 범위 프레임 축 스타일을 구현하고 싶습니다. 내 최선의 시도는 다음과 같습니다

\documentclass{minimal}
\usepackage{tikz}
\usepackage{pgfplots}
\def\axisdefaultwidth{360pt}
\pgfplotsset{
  every axis/.append style={thick},tick style={thick,black},
  range3frame/.style={
    tick align=outside,
    scaled ticks=false,
    enlargelimits=false,
    ticklabel shift={10pt},
    axis lines*=left,
    line cap=round,
    clip=false
  }
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[view={55}{45}]
    \addplot3[mesh,samples=41,domain=0:360] {sin(x)*sin(y)};
  \end{axis}
\end{tikzpicture}
\begin{tikzpicture}
  \begin{axis}[range3frame,view={55}{45}]
    \addplot3[mesh,samples=41,domain=0:360] {sin(x)*sin(y)};
  \end{axis}
\end{tikzpicture}
\end{document}

이는 다음과 같은 결과를 낳습니다.

사인X타임메신Y

옵션은 ticklabel shift={10pt}눈금 표시 레이블에 대해 정확히 올바른 작업을 수행합니다. 피. pgfplots 매뉴얼 중 286개에는 다음과 같이 나와 있습니다.

눈금 레이블을 축의 외부 단위 법선 방향으로 ...만큼 이동합니다.

위의 sin(x)sin(y) 플롯의 두 가지 버전을 비교하면 아래쪽 플롯의 눈금 표시 레이블이 바로 오른쪽 축에서 멀어졌습니다.

tickmark shift불행히도 동일한 방식으로 외부 단위 법선 벡터를 따라 눈금 표시를 이동하는 옵션은 없습니다 . 또한 axis shift축을 오프셋하는 옵션도 없습니다.

2차원 솔루션에서 요령은 단순히 축을 이동하고 눈금 표시를 이동하기 위해 를 사용 xshift하고 yshift변환하는 것이 었습니다.x axis line stylextick style

tickmark shift옵션에서 외부 단위 법선 벡터에 액세스하고 변환을 사용하여 눈금 레이블과 동일한 방식으로 축과 눈금을 이동하는 방법이 있습니까 ?

답변1

편집하다

pgfplots의 최신 버전에서는 axis line shift다음과 같이 스타일을 단순화할 수 있습니다.

\documentclass{standalone}
\usepackage{pgfplots}
\def\axisdefaultwidth{360pt}

\pgfplotsset{
  every axis/.append style={thick},tick style={thick,black},
  %
  range3frame/.style={
    tick align=outside,
    scaled ticks=false,
    enlargelimits=false,
    axis lines*=left,
    line cap=round,
    clip=false,
    axis line shift=10pt,
  }
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[range3frame,view={55}{45}]
    \addplot3[mesh,samples=41,domain=0:360] {sin(x)*sin(y)};
  \end{axis}
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

편집 끝


미리 정의된 스타일은 없습니다.

하지만 여기에 5줄로 정의된 것이 있습니다.

여기에 이미지 설명을 입력하세요

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\def\axisdefaultwidth{360pt}

\pgfplotsset{
  every axis/.append style={thick},tick style={thick,black},
  %
  % #1 = x, y, or z
  % #2 = the shift value
  /tikz/normal shift/.code 2 args={%
    \pgftransformshift{%
        \pgfpointscale{#2}{\pgfplotspointouternormalvectorofticklabelaxis{#1}}%
    }%
  },%
  %
  range3frame/.style={
    tick align=outside,
    scaled ticks=false,
    enlargelimits=false,
    ticklabel shift={10pt},
    axis lines*=left,
    line cap=round,
    clip=false,
    xtick style={normal shift={x}{10pt}},
    ytick style={normal shift={y}{10pt}},
    ztick style={normal shift={z}{10pt}},
    x axis line style={normal shift={x}{10pt}},
    y axis line style={normal shift={y}{10pt}},
    z axis line style={normal shift={z}{10pt}},
  }
}

\begin{document}
\begin{tikzpicture}
  \begin{axis}[range3frame,view={55}{45}]
    \addplot3[mesh,samples=41,domain=0:360] {sin(x)*sin(y)};
  \end{axis}
\end{tikzpicture}
\end{document}

이 명령 \pgfplotspointouternormalvectorofticklabelaxis{x}은 의 단축키입니다 \pgfplotspointouternormalvectorofaxis{\pgfplotsticklabelaxisspec{x}}. \pgfplotspointouternormalvectorofticklabelaxis참조 매뉴얼에 에 대한 문서가 누락된 것 같습니다 .

이 이동은 그리드 선과 호환되지 않습니다(구성상!). 이를 확인하기 위해 추가해 보면 grid=major설명이 약간 벗어난 것을 볼 수 있습니다. 그것이 원하는 것인지(또는 수리 방법)를 결정해야 할 수도 있습니다.

관련 정보