
這個問題是後續問題這個問題,這使我能夠解決二維情況。
例如這個情節
由以下程式碼建立:
\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}
現在我想在三維圖中實現相同的範圍框架軸樣式。我最好的嘗試是:
\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}
, 為刻度線標籤做了完全正確的事情。 p。 pgfplots 手冊第 286 條指出:
將刻度標籤沿軸的外部單位法線方向移動一定量...
比較上面 sin(x)sin(y) 圖的兩個版本,下面圖的刻度線標籤剛好遠離軸。
不幸的是,沒有tickmark shift
選項以相同的方式沿著外部單位法線向量移動刻度線。並且也沒有axis shift
偏移軸的選項。
在二維解決方案中,技巧是使用xshift
中yshift
的變換x axis line style
來簡單地移動軸,並使用 中的變換xtick style
來移動刻度線。
有沒有辦法從tickmark shift
選項存取外部單位法線向量並使用變換以與刻度線標籤相同的方式移動軸和刻度線?
答案1
編輯
最新版本的pgfplots
come with 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
,您會發現描述略有偏差。您可能需要決定這是否是您想要的(或如何修復它)。