Preservando estilos ao alterar a linha do eixo y em pgfplots

Preservando estilos ao alterar a linha do eixo y em pgfplots

O código para o MWE que gera esta imagem é fornecido abaixo (clique para ampliar):

teste-sbs.png

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 tikzpicturecom dois scopedentro; no entanto, o xshiftgrá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 extra minipage)?

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):

teste-sbs-fix

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=middlea posição do rótulo como desejo e, em seguida, redefini-lo axis y line*=leftdepois, 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" comaxis 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" yticklabele definir um comando condicional \ifnumali, que usa \ticknum(que aparentemente começa em 1) .

  • a fonte do rótulo dos eixos marca - o problema é que, por padrão, pgfplotsos eixos marcam os rótulos no modo matemático; por exemplo - deixei a yticklabelsobrecarga 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 xshiftof scope: 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 \textwidthmenos 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}

informação relacionada