使用虚拟轴环境

使用虚拟轴环境

有哪些选项可用于在图表轴上添加 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 xticky或键输入小刻度的明确位置。如果您想模仿这一点,您可以在 中z找到 的定义。\pgfplots@init@collect@firstplotastickpgfplots.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

您需要重写这个宏。

在这个地方我们明白了为什么拒绝为不均匀的主刻度绘制次要刻度---\pgfplots@minor@tick@dist是一个全局变量;它不会因不同的主刻度而变化。

步骤 5 [可选]

对数图有小刻度...如果您想要...

第 6 步

终于见到了\pgfplots@drawticklines@onorientedsurf@。它会在规定的位置画出刻度。

您需要重写这个宏。


我能说的就这么多。成功实现后一定要回答你自己的问题。

相关内容