![如何制作具有对数刻度的尺子?](https://linux22.com/image/314752/%E5%A6%82%E4%BD%95%E5%88%B6%E4%BD%9C%E5%85%B7%E6%9C%89%E5%AF%B9%E6%95%B0%E5%88%BB%E5%BA%A6%E7%9A%84%E5%B0%BA%E5%AD%90%EF%BC%9F.png)
我正在尝试制作一个自定义剪切计算尺的滑块,每侧都有对数增量/刻度。一侧的刻度需要从 100 到 5000。另一侧需要从 0.1 到 10。
我可以制作一把尺子,如下所示:
\documentclass[12pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[rotate=0,transform shape]
%% Draws a 15 cm ruler ''box''
\draw (-0.2,0) rectangle (15.5,1);
%% Lower side divisions in cm
% Draws long line every 1 cm
\foreach \x in {0,1,...,15}{
\draw (\x,0) -- (\x,0.2)node[above,scale=0.4]{\x};
}
% Draws medium line every 0.5 cm
\foreach \x in {0.1,0.2,...,14.9}{
\draw (\x,0) -- (\x,0.075);
}
% Draws short line every 0.1 cm
\foreach \x in {0.5,1,...,14.5}{
\draw (\x,0) -- (\x,0.15);
}
%% Upper side divisions in inches
% Draws long line every 1 in
\foreach \x in {0,1,...,6}{
\draw (\x in,1) -- (\x in,0.8)node[below,scale=0.4]{\x};
}
% Draws medium line every 0.5 in
\foreach \x in {0.1,0.2,...,5.9}{
\draw (\x in,1) -- (\x in,0.925);
}
% Draws short line every 0.1 in
\foreach \x in {0.5,1,...,5.5}{
\draw (\x in,1) -- (\x in,0.85);
}
\end{tikzpicture}
\end{document}
但这只是正常的、均匀的增量。我一直在到处寻找如何使它们成为对数,但到目前为止我还没有运气。我最接近的是 axis 和 pgfplots,但我不知道如何将其用于像上面那样的滑块/标尺。
如果能提供任何正确的建议或指引,我将非常感激!
提前感谢所有能够提供帮助的人。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
问题澄清/更新:
你好,我们又见面了。
我之前做的不够精确。我想制作一个与此类似的尺子:
它不需要完全一样,而且刻度的内部位置目前并不重要。我只是想知道如何进行对数除法。我看过这里的另一篇文章:如何在 TikZ 中制作计算尺?
这里的解决方案是具有隐藏轴的对数网格系统,产生如下效果:
这给我带来了几个问题:我还没搞清楚如何在上面加上自定义编号,即 (0.1,0.2,0.3,...1,2,3,...10,20,30,...100) 而不是 1e0.1,1e0,2 等等。另一个方法是将两个并排放在“标尺”中,以便剪切。
如果 \foreach 可以直接执行此操作,那就太完美了。但我在任何地方都找不到有关它的任何信息。
我希望这能让我的问题更清楚一些。
答案1
这是您的问题的解决方案。可以通过在 -循环中选择其他计算来调整值foreach
。此示例使用循环通过应用乘数(,和)来创建从1
到 的步骤。这会移动以适应其位置。10
0.1
1
10
scope
为了获得正确的方向,您必须旋转tikzpicture
(您也可以使用另一个scope
)并调整node's
位置和旋转。
\documentclass[tikz, border=6mm]{standalone}
\begin{document}
\begin{tikzpicture}[scale=4, rotate=90]
\foreach \i\s in {0.1/0,1/1,10/2} {
\begin{scope}[xshift=\s cm]
\foreach \x [evaluate=\x as \y using log10(\x), evaluate=\x as \l using \x*\i] in {1,...,10} {
\draw (\y,0) -- ++(0,.25) node [left, rotate=0] {\tiny \pgfmathprintnumber{\l}};
}
\foreach \x [evaluate=\x as \y using log10(\x)] in {1,1.2,...,10} {
\draw (\y,0) -- ++(0,.1);
}
\end{scope}
}
\draw (-.1,0) rectangle ++(3.2,.5);
\end{tikzpicture}
\end{document}