我正在尝试绘制左 y 轴从 0.5 到 0.88 的图形,其中 0.88 位于框的顶部边框(例如第二个 y 轴上的 160)。
但即使为了得到 0.88,我也必须将 ymax 和(最后一个 ytick)设置为 0.9,但它仍然不在顶部!
为什么是这样?
为什么我将 ymax 和 ytick 设置为比我想要的数字多 0.02 点?为什么数字不在顶部?
我真的不知道问题出在哪里!
提前致谢!
\documentclass[fontsize=12pt,
paper=a4,
twoside=false,
]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{siunitx}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9,
/pgf/number format/1000 sep={},
/pgf/number format/use comma,
}
\usepgfplotslibrary{units}
\usepgfplotslibrary{groupplots}
\begin{document}
%
\begin{tikzpicture}
%
\pgfplotsset{set layers,
ticklabel shift={0.05cm}}
%
\begin{axis}[width=0.8\textwidth,
grid=major,
ymin = 0.5,
ymax = 0.9,
ytick={0.5,0.52,...,0.9},
y tick label style={/pgf/number format/fixed,/pgf/number format/fixed zerofill=true,/pgf/number format/precision=2},
axis y line*=left,
ylabel={voltage},
y unit=\si{\volt},
xlabel={time},
x unit = \si{\minute},
xtick={0,5,...,75},
xmin = 0,
xmax = 75,
]
%
\end{axis}
%
\begin{axis}[width=0.8\textwidth,
%grid=major,
%/pgf/number format/precision=3,
legend style={legend columns=-1,anchor=north},
legend style={at={(0.5,-0.15)}},
%legend cell align=left,
ymin = 0,
ymax = 160,
%ytick={0,10,...,160},
axis y line*=right,
xlabel={time},
x unit = \si{\minute},
xtick={0,5,...,75},
xmin = 0,
xmax = 75,
axis x line=none,
ylabel={current},
y unit= \si{\ampere},
]
%
%
\end{axis}
%
\end{tikzpicture}
%
\end{document}
经过进一步调查我终于找出了问题所在。
看来设置ymin
和ymax
和另外ytick={...}
导致了问题。
ytick={...}
似乎(有时)根据定义而以不同的方式工作。
以下是具有行为和解释的 MWE:
ymax
和ymin
是0.5
和1
并且 我希望0.05
在 y 轴上有步骤。
如果我只定义ymin=0.5
,ymax=1
y 轴上的刻度为 0.5、0.6、0.7、...、1.0。但这不是我想要的。
因此,我没有使用ymin
和,而是定义了。但是 y 轴上的刻度只有 0.55 到 0.95。因此,第一个和最后一个被忽略了。ymax
ytick={0.5, 0.55, ..., 1}
如果我只定义,ytick={0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1}
则只会忽略第一个刻度。因此 y 轴上的刻度从 0.55 到 1。
因此,定义ymin=0.5
和ymax=1
并另外ytick={0.5, 0.55, ..., 1}
阻止打印最后一个 y-tick 1.0!
这就是我的问题。我想以 0.05 为步长将 0.5 变为 1。但是如果另外指定这些,ytick={0.5, 0.55, ..., 1}
它只会打印到 0.95。
我现在正在做的是定义ymin=0.5
,ymax=1
并ytick={0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1}
得到正确的划分和所有的刻度。
我不知道这是否真的是一个问题,或者我只是不理解设置的行为ymax
以及ymin
另外ytick={...}
?!?!
非常欢迎任何避免定义所有 y 刻度的想法或如何正确设置 y 刻度的解释!
梅威瑟:
\documentclass[fontsize=12pt,
paper=a4,
twoside=false,
]{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9,
/pgf/number format/1000 sep={},
/pgf/number format/use comma,
enlargelimits=false,
}
\begin{document}
%
\begin{tikzpicture}
%
\begin{axis}[grid=major,
xlabel ={time /min},
xtick={0,10,...,60},
xmin = 0,
xmax = 60,
ylabel = {voltage /V},
ymin = 0.5,
ymax = 1,
%ytick={0.5,0.55,...,1}, %<-- first and last ytick is being ignored
%ytick={0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1} %<-- first ytick is being ignored
]
\addplot[color=red,no marks] coordinates{(0,0.52)(10,0.75)(20,0.85)(30,1)(40,0.85)(50,0.75)(60,0.55)};
\end{axis}
%
\end{tikzpicture}
%
\end{document}
答案1
显然,在我发表评论之前,我一下子更改了一些内容。仍然有可能找到解决方案,但这里的主要问题是如何\foreach
生成数组。
首先,pgfplots
检查最小和最大数据,因此在您的示例中,轴内没有绘制任何内容,因此采用间隔[0,1]
。如果没有数据,无论您提供什么,它仍将是这个间隔。我不知道这是不是功能或某些东西覆盖了设置。
当\foreach
开始读取点式语法中的增量时,它开始将增量添加到初始点,如果超出最后一个点,它会丢弃它,比如说,
\foreach\x in{1,2,...,4.9}{\x}
将给出1234
。因此它必须命中最后一个数字以下的某个数字或恰好命中最后一个数字。
这是您的问题的压缩版本。查看数字如何受到 TeX 算术污染。
\documentclass[]{standalone}
\usepackage{siunitx,pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ymin = 0.5,
ymax = 0.88,
y tick label style={/pgf/number format/.cd,fixed,fixed zerofill=true,precision=6},
ytick={0.5,0.52,...,0.88},
]\addplot {0.7 + (rand)/10};
\end{axis}
\end{tikzpicture}
\end{document}
最简单的解决办法就是稍微移动终点,0.8801
然后你就会到达那个点。
一个可能的解决方案是实现启用的\foreach
轴内环境fpu
,但这看起来需要做相当多的工作。