在 tikz 可视化中模拟“类似 MATLAB”的指数刻度

在 tikz 可视化中模拟“类似 MATLAB”的指数刻度

我正在尝试使用 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}

在此处输入图片描述

相关内容