生成此图像的 MWE 代码如下(单击可查看完整尺寸):
基本上,我有一些像左边的图表,直到我意识到我需要移动 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
好的,我找到了一些线索 - 除了我无法让图的组合宽度适合边距(希望有人能为此提供解决方案):
否则:
- 对齐 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
xshift
ofscope
:在中也发现了类似的问题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}