在 pgfplots 中更改轴 y 线时保留样式

在 pgfplots 中更改轴 y 线时保留样式

生成此图像的 MWE 代码如下(单击可查看完整尺寸):

测试-sbs.png

基本上,我有一些像左边的图表,直到我意识到我需要移动 x 轴 - 这也迫使我将axis y line=middle(左侧图)移动到axis y line=left(右侧图)。我的问题是:

  • 如何使 xlabel ("t [ms]") 和 ylabel ("D") 在右侧图上处于与左侧图相同的位置?(希望使用一个命令在两个地方使用;也就是说,不必在一个地方使用 rotate,而在另一个地方不使用 rotate)
  • 如何让零作为右侧图上的第一个 y 轴刻度标签消失,而无需手动输入标签?
  • 如何让零显示为左侧图上的第一个 x 轴刻度标签?
  • tikzpicture我喜欢一个图里面有两个s的组织方式scope;但是xshift右侧图的 是反复试验的。在这种结构下(即不引入额外的 ),推荐的“自动”方法是什么来让两个图并排,每个图占据页面宽度的一半minipage

还有一个问题:如何使轴刻度标签字体与文档其余部分样式相同(此处IEEEtran)?

以下是代码:

\documentclass[%
  12pt,
  journal,
  twoside,
  draftcls,
  letterpaper,
]{IEEEtran}

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}

\pgfplotstableread[col sep=&,row sep=\\]{
  0.0159779999812599 & 0.00398599999607541 \\
  0.0240009999834001 & 0.00802300000214018 \\
  0.0240489999996498 & 4.80000162497163e-05 \\
  0.0280280000006314 & 0.00397900000098161 \\
}\mytable

\begin{scope}
\begin{axis}[
  title={\small my data},
  title style={at={(0.5,0.9)},anchor=center},
  clip=true,
  axis x line=middle,
  axis y line=middle,
  xmin = 0,
  xmax = 0.03,
  ymin = 0,
  ymax = 0.009,
  xlabel={$t$\,[ms]},
  xlabel style={at={(axis description cs:1.01,+0.0)},anchor=west},
  ylabel={$D$},
  ylabel style={at={(axis description cs:-0.02,1.01)},anchor=south},
  %xtick=data,
  scaled x ticks=base 10:3,
  xtick scale label code/.code={},
  x tick label style={
    rotate=-45,
    anchor=west,
    /pgf/number format/fixed,
    /pgf/number format/fixed zerofill,
    /pgf/number format/precision=3,
  },
  ymajorticks=true,
  yminorticks=false,
  tick label style={font=\small,},
  legend cell align=left,
  legend pos=outer north east,
]

\addplot table \mytable;

\end{axis}
\end{scope}

\begin{scope}[xshift=240]
\begin{axis}[
  title={\small my data},
  title style={at={(0.5,0.9)},anchor=center},
  clip=true,
  axis x line=bottom,
  axis y line=left,
  xmin = -0.005,
  xmax = 0.025,
  ymin = 0,
  ymax = 0.009,
  xlabel={$t$\,[ms]},
  xlabel style={at={(axis description cs:1.01,+0.0)},anchor=west},
  ylabel={$D$},
  ylabel style={at={(axis description cs:-0.02,1.01)},anchor=south},
  %xtick=data,
  scaled x ticks=base 10:3,
  xtick scale label code/.code={},
  x tick label style={
    rotate=-45,
    anchor=west,
    /pgf/number format/fixed,
    /pgf/number format/fixed zerofill,
    /pgf/number format/precision=3,
  },
  ymajorticks=true,
  yminorticks=false,
  tick label style={font=\small,},
  legend cell align=left,
  legend pos=outer north east,
]

\addplot table \mytable;

\end{axis}
\end{scope}

\end{tikzpicture}
\end{document}

\end{document}

答案1

好的,我找到了一些线索 - 除了我无法让图的组合宽度适合边距(希望有人能为此提供解决方案):

测试-sbs-修复

否则:

  • 对齐 xlabel、ylabel:有点麻烦;请注意手册中指出:

    带星号的版本 . . . line* 仅影响轴线,而不会修正轴标签、刻度线或其他可能受轴线改变影响的键的位置。

在这种情况下,这意味着我应该首先axis y line=middle根据需要设置标签位置,然后再重新设置axis y line*=left,这样只有轴位置会发生变化(这也会添加 0 作为 ytick 标签)

  • 零出现在左侧图上的第一个 x 轴刻度标签 - 类似地,通过“重载”axis x line*=bottom

  • 零作为右侧图上的第一个 y 轴刻度标签消失 - 有点棘手,但似乎唯一有效的方法是“重载”yticklabel并通过其中设置条件命令\ifnum,使用\ticknum(显然从 1 开始)。

  • 轴刻度标签字体 - 问题是默认情况下,pgfplots在数学模式下排版轴刻度标签;例如 - 我保留了重载,yticklabel因此它直接排版数字,并且可以看到它是 Times。否则,在 pgfplots 中轴上也更改字体解释说,必须加载一个额外的包才能使用 Times 作为数学字体,并且对我来说\usepackage{txfonts}是可行的(尽管我遇到了描述的问题本地字体安装问题,那里的解决方案对我有用)。

  • auto xshiftof scope:在中也发现了类似的问题pgfplots - 相对于另一个 tikz 范围定位 tikz 范围。这不是完全自动的,但我使用一半\textwidth减去一半的预期间隔来设置图的宽度;从图中可以看出,它几乎在那里,但与边距不太正确;可能也必须测试@JohnKormylo 的建议

代码如下:

\documentclass[%
  12pt,
  journal,
  twoside,
  draftcls,
  letterpaper,
]{IEEEtran}


% \usepackage{txfonts} % Times font in math; 
% tlmgr install txfonts ; texhash ; updmap-sys --enable Map=txfonts.map ; texhash
% [rm ~/.texlive2011/texmf-var/fonts/map/pdftex/updmap/pdftex.map]

\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning} % of

% https://tex.stackexchange.com/questions/33703/extract-x-y-coordinate-of-an-arbitrary-point-in-tikz
\makeatletter
\newcommand{\gettikzxy}[3]{%
  \tikz@scan@one@point\pgfutil@firstofone#1\relax
  \edef#2{\the\pgf@x}%
  \edef#3{\the\pgf@y}%
}
\makeatother

\begin{document}

\newlength{\pw}
\setlength{\pw}{0.5\textwidth}
\addtolength{\pw}{-0.5cm}

\begin{tikzpicture}

\pgfplotstableread[col sep=&,row sep=\\]{
  0.0159779999812599 & 0.00398599999607541 \\
  0.0240009999834001 & 0.00802300000214018 \\
  0.0240489999996498 & 4.80000162497163e-05 \\
  0.0280280000006314 & 0.00397900000098161 \\
}\mytable

\begin{scope}[local bounding box=scope1]
\begin{axis}[
  title={\small my data},
  title style={at={(0.5,0.9)},anchor=center},
  clip=true,
  width=\pw,
  axis x line=middle,
  axis y line=middle,
  axis x line*=bottom,
  xmin = 0,
  xmax = 0.03,
  ymin = 0,
  ymax = 0.009,
  xlabel={$t$\,[ms]},
  xlabel style={at={(axis description cs:1.01,+0.0)},anchor=west},
  ylabel={$D$},
  ylabel style={at={(axis description cs:-0.02,1.01)},anchor=south},
  scaled x ticks=base 10:3,
  xtick scale label code/.code={},
  x tick label style={
    rotate=-45,
    anchor=west,
    /pgf/number format/fixed,
    /pgf/number format/fixed zerofill,
    /pgf/number format/precision=3,
  },
  ymajorticks=true,
  yminorticks=false,
  tick label style={font=\small,},
  legend cell align=left,
  legend pos=outer north east,
]

\addplot table \mytable;

\end{axis}
\end{scope}

\gettikzxy{($(scope1.east)+(1cm,0)$)}{\ax}{\ay}

% none of this works:
% \begin{scope}[remember picture,at={($(scope1.east)+(1cm,0)$)}]%right=of scope1.east]%[at={($(scope1.east)+(1cm,0)$)}] 
% ... only xshift:
\begin{scope}[xshift=\ax]
\begin{axis}[
  title={\small my data},
  title style={at={(0.5,0.9)},anchor=center},
  clip=true,
  width=\pw,
  axis x line=middle,
  axis y line=middle,
  axis x line*=bottom,
  axis y line*=left,
  xmin = -0.005,
  xmax = 0.025,
  ymin = 0,
  ymax = 0.009,
  xlabel={$t$\,[ms]},
  xlabel style={at={(axis description cs:1.01,+0.0)},anchor=west},
  ylabel={$D$},
  ylabel style={at={(axis description cs:-0.02,1.01)},anchor=south},
  scaled x ticks=base 10:3,
  xtick scale label code/.code={},
  x tick label style={
    rotate=-45,
    anchor=west,
    /pgf/number format/fixed,
    /pgf/number format/fixed zerofill,
    /pgf/number format/precision=3,
  },
  %yticklabel={\ifnum\ticknum=1{}\else\axisdefaultticklabel\fi},
  yticklabel={\ifnum\ticknum=1{}\else\tick\fi},
  ymajorticks=true,
  yminorticks=false,
  tick label style={font=\small,},
  legend cell align=left,
  legend pos=outer north east,
]

\addplot table \mytable;

\end{axis}
\end{scope}

\end{tikzpicture}
\end{document}

相关内容