El código para el MWE que genera esta imagen se proporciona a continuación (haga clic para ver en tamaño completo):
Básicamente, tenía algunos gráficos como el de la izquierda, hasta que me di cuenta de que necesitaba desplazar el eje x; esto también me obliga a moverme axis y line=middle
(gráfico de la izquierda) a axis y line=left
(gráfico de la derecha). Mis preguntas son:
- ¿Cómo consigo que la etiqueta x ("t [ms]") y la etiqueta y ("D") estén en la misma posición en el gráfico de la derecha que en el gráfico de la izquierda? (Con suerte, con un solo comando se puede usar en ambos lugares; es decir, sin tener que usar rotar en uno y no rotar en el otro)
- ¿Cómo consigo que el cero desaparezca como la primera etiqueta de marca del eje y en el gráfico de la derecha, sin ingresar etiquetas manualmente?
- ¿Cómo consigo que el cero aparezca como la primera etiqueta de marca del eje x en el gráfico de la izquierda?
- Me gusta la organización de uno
tikzpicture
con dosscope
dentro; sin embargo, elxshift
diagrama de la derecha es de prueba y error. ¿Cuál sería la forma "automática" recomendada de colocar los dos gráficos uno al lado del otro, ocupando cada uno la mitad del ancho de la página, con esta estructura (es decir, sin introducir elementos adicionalesminipage
)?
Y una pregunta secundaria: ¿cómo consigo que la fuente de la etiqueta de marca de los ejes sea la misma que la del resto del estilo del documento (aquí IEEEtran
)?
Aquí está el 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}
Respuesta1
Bien, llegué a alguna parte, excepto que no puedo lograr que el ancho combinado de las parcelas encaje dentro de los márgenes (espero que alguien ofrezca una solución para eso):
De lo contrario:
- Alinear xlabel, ylabel: es un poco complicado; tenga en cuenta que el manual dice:
Las versiones estrelladas. . . line* solo afecta las líneas de los ejes, sin corregir las posiciones de las etiquetas de los ejes, las líneas de marca u otras claves que (posiblemente) se vean afectadas por una línea de eje modificada.
lo que en este caso significa que primero debo configurar axis y line=middle
la posición de la etiqueta como quiero, luego volver a configurarla axis y line*=left
después, de modo que solo cambie la posición del eje (esto también agrega el 0 como etiqueta ytick)
el cero aparecerá como la primera etiqueta de marca del eje x en el gráfico de la izquierda; de manera similar, "sobrecargando" con
axis x line*=bottom
el cero desaparece como la primera etiqueta de marca del eje y en el gráfico de la derecha; algo complicado, pero parece que lo único que funciona es "sobrecargar"
yticklabel
y establecer un comando condicional\ifnum
allí, que usa\ticknum
(que aparentemente comienza desde 1) .la fuente de la etiqueta de marca de los ejes: el problema es que, de forma predeterminada,
pgfplots
las etiquetas de marca de los ejes se escriben en modo matemático; como ejemplo - he dejado elyticklabel
sobrecarga para que escriba el número directamente y se pueda ver que está en Times. De lo contrario,Cambiar fuente también en los ejes en pgfplotsexplica que se debe cargar un paquete adicional para usar Times como fuente matemática, y para mí\usepackage{txfonts}
funciona (aunque encontré el problema descrito enProblemas de instalación de fuentes locales, y la solución funcionó para mí).auto
xshift
descope
: se observa un problema similar enpgfplots: posicionamiento de un alcance tikz en relación con otro alcance tikz. Esto no es del todo automático, pero uso la mitad\textwidth
menos la mitad de la separación prevista para establecer el ancho de un gráfico; como se puede ver en la imagen, ya casi está ahí pero no del todo bien con los márgenes; Probablemente también tendré que probar la sugerencia de @JohnKormylo.
Y aquí está el 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}