临时措施

临时措施

在 pgfplot 中,是否可以为轴的自动缩放提供最小/最大值?换句话说;我希望y=0始终以如下方式位于垂直轴上:

ymin=min(0,minimum_plotted_value)
ymax=max(0,maximum_plotted_value)

这是我的示例代码:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\usepackage{csvsimple}
\usepackage{filecontents}

\begin{filecontents*}{data.csv}
    x,value
    0, 3.2
    5, 6.5
    14, 6.8
    31, 2.2
\end{filecontents*}

\begin{document}
    \begin{tikzpicture}
    \centering
    \begin{axis}[
    ]
    \addplot table [x=x, y=value, col sep=comma] {data.csv};
    \end{axis}
    \end{tikzpicture}
\end{document}

答案1

临时措施

添加

\makeatletter
\gdef\pgfplots@ymin{0Y0.0e0]}
\gdef\pgfplots@ymax{0Y0.0e0]}

\begin{axis}

正如人们可能猜到的那样:\pgfplots@ymin它的朋友是 PgfPlots 用来计算绘图极限的寄存器。 的min初始化为 10 2147483645, 的max初始化为 -10 2147483645。现在,您希望 PgfPlots 做的是将其视为0第一个输入并相应地更新寄存器。因此,我们只需要在初始化它们后将它们设置为0(这是FPU 的概念)。0Y0.0e0]

故事

pgfplots.code.tex

\global\pgfkeysgetvalue{/pgfplots/xmin}{\pgfplots@xmin}%
\global\pgfkeysgetvalue{/pgfplots/xmax}{\pgfplots@xmax}%
\global\pgfkeysgetvalue{/pgfplots/ymin}{\pgfplots@ymin}%
\global\pgfkeysgetvalue{/pgfplots/ymax}{\pgfplots@ymax}%
\global\pgfkeysgetvalue{/pgfplots/zmin}{\pgfplots@zmin}%
\global\pgfkeysgetvalue{/pgfplots/zmax}{\pgfplots@zmax}%

xmin=PgfPlots 读取及其朋友的值。

\pgfplotsutilforeachcommasep{x,y,z}\as\pgfplots@loc@TMPa{%
        \pgfplotscoordmath \pgfplots@loc@TMPa{min limit}%
        \expandafter\let\csname pgfplots@invalidrange@\pgfplots@loc@TMPa max\endcsname=\pgfmathresult
        \pgfplotscoordmath \pgfplots@loc@TMPa{max limit}%
        \expandafter\let\csname pgfplots@invalidrange@\pgfplots@loc@TMPa min\endcsname=\pgfmathresult
    }%

PgfPlots 设置pgfplots@invalidrange@xmin为 10 2147483645等等。

\ifx\pgfplots@xmin\pgfutil@empty
    \pgfplots@autocompute@xmintrue
    \global\let\pgfplots@xmin=\pgfplots@invalidrange@xmin
\else
    \pgfplots@autocompute@all@limitsfalse
\fi

PgfPlots 检查是否\pgfplots@xmin为空。也就是说,它会检查您是否为 分配了任何值xmin。如果是,则它会关闭 x 轴最小值的极限计算。如果不是,则为\pgfplots@xmin10 2147483645,并且 PgfPlots 已准备好计算极限。

结论

如果您分配了,xmin=那么 PgfPlots 将关闭限制计算。但我们可以手动将其打开:

\makeatletter
\pgfplotsset{
    ymin*/.code={
        \pgfkeysalso{ymin=#1}
        \pgfplots@autocompute@ymintrue
    },
    ymax*/.code={
        \pgfkeysalso{ymax=#1}
        \pgfplots@autocompute@ymaxtrue
    }
}
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[ymin*=0,ymax*=0]
            \addplot table[x=x, y=value,col sep=comma] {data.csv};
        \end{axis}
    \end{tikzpicture}
\end{document}

您甚至可以设置ymin*=-1,ymax*=1使轴始终包含该间隔。

相关内容