
이 질문은 후속 조치입니다.이 질문, 이를 통해 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}
비슷하게
다음에 의해 생성됩니다:
\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}
이는 다음과 같은 결과를 낳습니다.
옵션은 ticklabel shift={10pt}
눈금 표시 레이블에 대해 정확히 올바른 작업을 수행합니다. 피. pgfplots 매뉴얼 중 286개에는 다음과 같이 나와 있습니다.
눈금 레이블을 축의 외부 단위 법선 방향으로 ...만큼 이동합니다.
위의 sin(x)sin(y) 플롯의 두 가지 버전을 비교하면 아래쪽 플롯의 눈금 표시 레이블이 바로 오른쪽 축에서 멀어졌습니다.
tickmark shift
불행히도 동일한 방식으로 외부 단위 법선 벡터를 따라 눈금 표시를 이동하는 옵션은 없습니다 . 또한 axis shift
축을 오프셋하는 옵션도 없습니다.
2차원 솔루션에서 요령은 단순히 축을 이동하고 눈금 표시를 이동하기 위해 를 사용 xshift
하고 yshift
변환하는 것이 었습니다.x axis line style
xtick 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
설명이 약간 벗어난 것을 볼 수 있습니다. 그것이 원하는 것인지(또는 수리 방법)를 결정해야 할 수도 있습니다.