扩大限制至最接近的刻度

扩大限制至最接近的刻度

我使用pgfplots自动绘制多个数据集。在这种情况下,x 轴不会被放大。我使用放大 y 限值来更清楚地查看数据,但我希望它缩放到最接近的刻度而不是预定义的百分比或值,而无需先手动查看数据并使用ymin, ymax

这是我目前拥有的示例代码 扩大限制

这是所需的图(通过手动设置ymin和制作ymax扩大限制至最接近的刻度

提前致谢。

以下是示例代码

\documentclass{article}
\usepackage{pgfplots}

\begin{document}
    \begin{tikzpicture}
        \begin{axis}[compat=newest,enlarge x limits=false,
        title=plot example,
        xlabel=x-axis,
        ylabel=y-axis,
        legend columns=-1,
        major grid style={black},
        minor tick num=1,
        grid=both,
        legend style={thick},
        enlarge y limits]
            \addplot[red,ultra thick] table[x=input,y=output]%
            {input output
            108 14.56
            110  16.25
            112  17.95
            114  19.68
            116  21.43
            118  22.99
            120  23.66
            122  24.3
            124  24.92
            126  25.56
            128  26.18
            130  26.8
            132 27.41
            };
            \addlegendentry{data}
        \end{axis}
    \end{tikzpicture}
\end{document}

答案1

这将是真的修改绘图范围计算的例程并使结果与给定宽度的步骤对齐,这很酷。我尝试阅读一些pgfplots源代码来劫持它,但它变得太复杂了,太快了。这超出了我的能力范围,我将把这项工作留给更pgfplots精明的人。

在这里我采用外部路线:使用pgfplotstable我找到数据集的极值并使用它们的预可视化进行计算以设置正确的键。

主要缺点:我写的内容依赖于单身的数据集。您似乎一次只绘制一个,所以这不是问题。如果要绘制多个,使用它们的并集进行计算将是一个合理的解决方法。

主要优势:我定义的捕捉过程不限于绘图范围。事实上,snap hi和的第一个参数snap lo可以是任何接受分配的键。也许有一些巧妙的用途。

以下是代码和可预测的结果:

\documentclass{standalone}
\usepackage{pgfplots}

\pgfplotstableread{
input output
108 14.56
110 16.25
112 17.95
114 19.68
116 21.43
118 22.99
120 23.66
122 24.30
124 24.92
126 25.56
128 26.18
130 26.80
132 27.41
}\dataset

% helper function to find extrema in table columns
\def\foldcolumn#1\of#2\with#3\into#4{%
  % get first row to initialize the cursor value
  \pgfplotstablegetelem{0}{#1}\of{#2}%
  \let\cursor\pgfplotsretval%
  % get number of rows to initialize the cycle
  \pgfplotstablegetrowsof{#2}%
  \pgfmathsetmacro{\N}{\pgfplotsretval-1}%
  % cycle from 0 instead of 1 to gracefully handle the case N=0 (1 row table)
  \pgfplotsinvokeforeach {0,...,\N}{%
    \pgfplotstablegetelem{##1}{#1}\of{#2}%
    \pgfmathparse{\pgfplotsretval#3\cursor}
    \if1\pgfmathresult\relax%
      \pgfmathsetmacro\cursor{\pgfplotsretval}\fi}%
  \let#4\cursor}

% styles to make it pretty
\pgfplotsset{
  snap lo/.code args={#1 to column #2 of table #3 with step #4}{%
    \foldcolumn#2\of#3\with{<}\into\minimum%
    \pgfmathsetmacro\minimum{floor(\minimum/#4)*#4}%
    \pgfkeysalso{#1=\minimum}},
  snap hi/.code args={#1 to column #2 of table #3 with step #4}{%
    \foldcolumn#2\of#3\with{>}\into\maximum%
    \pgfmathsetmacro\maximum{ceil(\maximum/#4)*#4}%
    \pgfkeysalso{#1=\maximum}},
  snap range/.style args={#1 to column #2 of table #3 with step #4}{
    snap hi={#1max to column #2 of table #3 with step #4},
    snap lo={#1min to column #2 of table #3 with step #4},},}

% styles of your MWE, nothing to see here
\pgfplotsset{
  your old styles/.style={
    compat=newest,
    enlarge x limits=false,
    title=plot example,
    xlabel=x-axis,
    ylabel=y-axis,
    legend columns=-1,
    major grid style={black},
    minor tick num=1,
    grid=both,
    legend style={thick},},}

\begin{document}
  \begin{tikzpicture}
    \begin{axis} [your old styles,
        snap range={y to column output of table {\dataset} with step 10}]
      \addplot [red, ultra thick] table [x=input,y=output] {\dataset};
      \addlegendentry{data}
    \end{axis}
  \end{tikzpicture}
\end{document}

噗——!

相关内容