O código para o MWE que gera esta imagem é fornecido abaixo (clique para ampliar):
Basicamente, eu tinha alguns gráficos como o da esquerda, até perceber que precisava deslocar o eixo x - isso também me obriga a mover axis y line=middle
(gráfico da esquerda) para axis y line=left
(gráfico da direita). Minhas perguntas são:
- Como faço para que o xlabel ("t [ms]") e o ylabel ("D") estejam na mesma posição no gráfico da direita e no gráfico da esquerda? (esperamos que com um único comando seja usado em ambos os lugares; ou seja, sem ter que usar girar em um e não usar girar no outro)
- Como faço para que o zero desapareça como o primeiro rótulo do eixo y no gráfico à direita, sem inserir os rótulos manualmente?
- Como faço para que o zero apareça como o primeiro rótulo do eixo x no gráfico à esquerda?
- Gosto da organização de um
tikzpicture
com doisscope
dentro; no entanto, oxshift
gráfico da direita é tentativa e erro. Qual seria a forma "automática" recomendada de colocar os dois gráficos lado a lado, cada um ocupando metade da largura da página, com esta estrutura (ou seja, sem introdução extraminipage
)?
E uma pergunta secundária: como faço para que a fonte do rótulo dos eixos seja igual ao resto do estilo do documento (aqui IEEEtran
)?
Aqui está o código:
\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}
Responder1
OK, cheguei a algum lugar - exceto que não consigo fazer com que a largura combinada dos gráficos caiba nas margens (espero que alguém ofereça uma solução para isso):
De outra forma:
- Alinhar o xlabel, ylabel: é um pouco chato; observe que o manual afirma:
As versões estreladas. . . line* afetam apenas as linhas dos eixos, sem corrigir as posições dos rótulos dos eixos, linhas de escala ou outras chaves que são (possivelmente) afetadas por uma linha de eixo alterada.
o que, neste caso, significa que devo primeiro definir axis y line=middle
a posição do rótulo como desejo e, em seguida, redefini-lo axis y line*=left
depois, para que apenas a posição do eixo mude (isso também adiciona o 0 como rótulo ytick)
o zero apareça como o primeiro rótulo de escala do eixo x no gráfico à esquerda - da mesma forma, "sobrecarregando" com
axis x line*=bottom
o zero desaparece como o primeiro rótulo do eixo y no gráfico à direita - um pouco complicado, mas parece que a única coisa que funciona é "sobrecarregar"
yticklabel
e definir um comando condicional\ifnum
ali, que usa\ticknum
(que aparentemente começa em 1) .a fonte do rótulo dos eixos marca - o problema é que, por padrão,
pgfplots
os eixos marcam os rótulos no modo matemático; por exemplo - deixei ayticklabel
sobrecarga para que ele digite o número diretamente e pode ser visto no Times. De outra forma,Altere a fonte também nos eixos em pgfplotsexplica que um pacote adicional deve ser carregado para usar Times como fonte matemática, e para mim\usepackage{txfonts}
funciona (embora eu tenha encontrado o problema descrito emProblemas de instalação de fontes locais, e a solução funcionou para mim).auto
xshift
ofscope
: um problema semelhante é observado empgfplots - Posicionando um escopo tikz em relação a outro escopo tikz. Isso não é exatamente automático, mas eu uso metade\textwidth
menos metade da separação pretendida para definir a largura de um gráfico; como pode ser visto na imagem, está quase lá, mas não combina com as margens; provavelmente terá que testar a sugestão de @JohnKormylo também
E aqui está o código:
\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}