在 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@xmin
10 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
使轴始终包含该间隔。