![在 tikz 可视化中模拟“类似 MATLAB”的指数刻度](https://linux22.com/image/331796/%E5%9C%A8%20tikz%20%E5%8F%AF%E8%A7%86%E5%8C%96%E4%B8%AD%E6%A8%A1%E6%8B%9F%E2%80%9C%E7%B1%BB%E4%BC%BC%20MATLAB%E2%80%9D%E7%9A%84%E6%8C%87%E6%95%B0%E5%88%BB%E5%BA%A6.png)
我正在尝试使用 TikZ 的数据可视化库在我的 LaTeX 文档中包含一些图,但我对高值的轴刻度的数字格式不满意:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{filecontents}
\begin{filecontents*}{"datafile.txt"}
0, 0.5e6
1, 1e6
2, 1.3e6
\end{filecontents*}
\usetikzlibrary{datavisualization}
\begin{document}
\begin{tikzpicture}
\datavisualization[%
scientific axes,
visualize as line,
y axis={label=y label},
]
data [read from file="datafile.txt", headline={x, y}];
\end{tikzpicture}
\end{document}
我真的更喜欢一种更简洁的方法,就像 matlab 生成的图表中所做的那样:
有没有办法通过数据可视化库实现这种行为(轴顶部的公共指数)?我已经尝试调整排版器,但值太高而无法手动操作,然后我仍然必须创建额外的指数刻度,尽管我也可以满足于在轴标签中包含缩放比例。
答案1
这是一个相当困难的问题。
我们基本上想要的是,在将标签中的数字尾数缩放到最大指数后,将其设置为固定数字。因此,我定义了一个宏\newcommand{\maxE}{6}
。然后我定义我的排版器,在其中我将其用作数字格式的总体选项\pgfkeys{/pgf/number format/.cd,fixed,precision=1}
。这里的精度设置了句点后显示的数字位数。由于可能出现舍入误差,因此应谨慎使用更高的精度数字。\pgfmathfloatparsenumber{#1}
我将数据可视化给出的参数传递给我的代码。之后,我将\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}
标志、尾数和指数传递给我的预定义宏,以使用这些数字。然后我计算缩放的指数\renewcommand{\newE}{\E-\maxE}
并缩放要打印到标签上的数字\pgfmathparse{\M*pow(10,\newE)}
。之后\pgfmathprintnumber{\pgfmathresult}
打印数字。在数据可视化的最后,最终info{ \node [above right, style={font={\footnotesize}}] at (data visualization bounding box.north west) {$\times10^\maxE$};}
打印标签,概述轴缩放到的指数。
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{datavisualization}
\usepackage{filecontents}
%
\begin{filecontents*}{"datafile.txt"}
0, 0.5e6
1, 1e6
2, 1.3e6
\end{filecontents*}
%
% defining the macros to which we need to pass the variables in recalculating the tick labels
\newcommand{\F}{0}
\newcommand{\M}{1}
\newcommand{\E}{0}
\newcommand{\maxE}{6} % setting the exponent to which the labels should be scaled
\newcommand{\newE}{0}
%
% defining my typesetter
\makeatletter
\def\mytypesetter#1{%
\pgfkeys{/pgf/number format/.cd,fixed,precision=1} % The overall number formatting of the labels
\pgfmathfloatparsenumber{#1} % parsing the numbers to the code
\pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E} % passing flag, mantissa and exponent of the number to the predefined macros
\renewcommand{\newE}{\E-\maxE} % calculating the scaled exponent
\pgfmathparse{\M*pow(10,\newE)} % calculating the scaled number to print at the label
\pgfmathprintnumber{\pgfmathresult} % printing the number
}
%
\begin{document}
%
\begin{tikzpicture}
\datavisualization[%
scientific axes,
visualize as line,
y axis={
label=y label,
ticks={tick typesetter/.code=\mytypesetter{##1}} % passing the typesetting of the labels to my defined setter
}
]
data [read from file="datafile.txt", headline={x, y}]
info{
\node [above right, style={font={\footnotesize}}]
at (data visualization bounding box.north west) {$\times10^\maxE$};
}
;
%
\end{tikzpicture}
%
\end{document}