有哪些选项可用于在图表轴上添加 3 个(或更多)不同类型的刻度?这种格式的示例类似于您在标准标尺上看到的格式,其中主刻度(厘米)标有长线和数字,次刻度仅标有短线(毫米),第二种次刻度标记主刻度之间的中点,它比次刻度长,但比主刻度短。
编辑这是一个临时解决方案,仅适用于简单情况,但对于任何稍微复杂一点的情况来说,编码都会是一场噩梦。它也无法处理超过 3 种类型的滴答。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
[xmin=0,xmax=10,
xtick distance=1,
minor x tick num=9,
extra x ticks ={0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5},
extra x tick style={major tick length=0.15cm, xticklabels={}},
major tick length=0.2cm,
]
\addplot coordinates {(0,0)};
\end{axis}
\end{tikzpicture}
\end{document}
理想情况下,通用解决方案不需要明确列出每个三级刻度标记,例如:
xtick distance=1, % major tick every 1 inch
minor(type 1) x tick num=1, % minor tick every 1/2 inch
minor(type 2) x tick num=3, % minor tick every 1/4 inch
minor(type 3) x tick num=7, % minor tick every 1/8 inch
minor(type 4) x tick num=15, % minor tick every 1/16 inch
答案1
使用虚拟轴环境
您可以设置完全相同的axis
环境并要求他们为您绘制不同的小刻度。
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
% top for inch
\begin{axis}[
ytick=\empty,
axis x line=top,
x axis line style={-},
xticklabel={\pgfmathparse{int(\tick/2.54)}$\pgfmathresult$ in},
xmin=0,xmax=10,
xtick distance=2.54,
major tick length=20,
]
\addplot coordinates {(0,0)};
\end{axis}
% top for 1/2 inch
\begin{axis}[
axis y line=none,
ytick=\empty,
axis x line=top,
x axis line style={draw=none},
xticklabels={},
xmin=0,xmax=10,
xtick distance=2.54,
major tick length=0,
minor x tick num=1,
minor tick length=15,
]
\addplot coordinates {(0,0)};
\end{axis}
% top for 1/4 inch
\begin{axis}[
axis y line=none,
ytick=\empty,
axis x line=top,
x axis line style={draw=none},
xticklabels={},
xmin=0,xmax=10,
xtick distance=2.54,
major tick length=0,
minor x tick num=3,
minor tick length=10,
]
\addplot coordinates {(0,0)};
\end{axis}
% top for 1/8 inch
\begin{axis}[
axis y line=none,
ytick=\empty,
axis x line=top,
x axis line style={draw=none},
xticklabels={},
xmin=0,xmax=10,
xtick distance=2.54,
major tick length=0,
minor x tick num=7,
minor tick length=5,
]
\addplot coordinates {(0,0)};
\end{axis}
% middle for 50pt
\begin{axis}[
ytick=\empty,
axis x line=middle,
x axis line style={-},
xticklabel={\pgfmathparse{int(\tick*28.4527559055+.1)}$\pgfmathresult$pt},
xmin=0,xmax=10,
xtick distance=1.7572990176,
major tick length=20,
]
\addplot coordinates {(0,0)};
\end{axis}
% middle for 10pt
\begin{axis}[
axis y line=none,
ytick=\empty,
axis x line=middle,
x axis line style={draw=none},
xticklabels={},
xmin=0,xmax=10,
xtick distance=1.7572990176,
major tick length=0,
minor x tick num=5,
minor tick length=10,
]
\addplot coordinates {(0,0)};
\end{axis}
% bottom for cm
\begin{axis}[
ytick=\empty,
axis x line=bottom,
x axis line style={-},
xticklabel={\pgfmathparse{int(\tick)}\small$\pgfmathresult$cm},
xmin=0,xmax=10,
xtick distance=1,
major tick length=20,
]
\addplot coordinates {(0,0)};
\end{axis}
% bottom for .5 cm
\begin{axis}[
axis y line=none,
ytick=\empty,
axis x line=bottom,
x axis line style={draw=none},
xticklabels={},
xmin=0,xmax=10,
xtick distance=1,
major tick length=0,
minor x tick num=1,
minor tick length=15,
]
\addplot coordinates {(0,0)};
\end{axis}
% bottom for .1 cm
\begin{axis}[
axis y line=none,
ytick=\empty,
axis x line=bottom,
x axis line style={draw=none},
xticklabels={},
xmin=0,xmax=10,
xtick distance=1,
major tick length=0,
minor x tick num=9,
minor tick length=10,
]
\addplot coordinates {(0,0)};
\end{axis}
\end{tikzpicture}
\end{document}
一般来说
这只是一个理论。
步骤1
首先,你必须准备好密钥,例如
/pgfplots/minor x tick num/.initial=0, /pgfplots/minor x tick num/.belongs to family=/pgfplots/tick,
这一步并不难。但这是一个很好的机会来弄清楚你想要什么样的界面。查看pgfplots.code.tex
示例。
第 2 步 [可选]
用户可以通过/pgfplots/minor xtick
或y
或键输入小刻度的明确位置。如果您想模仿这一点,您可以在 中z
找到 的定义。\pgfplots@init@collect@firstplotastick
pgfplots.code.tex
还有一些杂项键,例如every minor tick
。
步骤3[推荐]
宏\pgfplots@check@for@minor@ticks
会检查用户是否想要绘制较小的刻度。我怀疑这只是一个优化问题。我强烈建议您对较小的刻度执行相同的操作。
步骤4
在pgfplotsticks.code.tex
其中定义了\pgfplots@prepare@tick@coordlists@for
。这是一个一体化宏,它以列表形式计算刻度的位置。然后将完整的刻度列表存储在
\pgfplots@prepared@tick@positions@minor@x % or y or z \pgfplots@prepared@tick@positions@major@x % or y or z
您需要重写这个宏。
在这个地方我们明白了为什么pgf图拒绝为不均匀的主刻度绘制次要刻度---\pgfplots@minor@tick@dist
是一个全局变量;它不会因不同的主刻度而变化。
步骤 5 [可选]
对数图有小刻度...如果您想要...
第 6 步
终于见到了\pgfplots@drawticklines@onorientedsurf@
。它会在规定的位置画出刻度。
您需要重写这个宏。
我能说的就这么多。成功实现后一定要回答你自己的问题。