Сохранение стилей при изменении линии оси Y в pgfplots

Сохранение стилей при изменении линии оси Y в pgfplots

Код для MWE, генерирующего это изображение, приведен ниже (кликните для просмотра в полном размере):

тест-sbs.png

В принципе, у меня были некоторые графики, как слева, пока я не понял, что мне нужно сместить ось x - это также заставляет меня переместить axis y line=middle(левый график) на axis y line=left(правый график). Мои вопросы:

  • Как мне сделать так, чтобы xlabel («t [ms]») и ylabel («D») находились в том же положении на правом графике, что и на левом? (надеюсь, с помощью одной команды, которая будет использоваться в обоих местах; то есть без необходимости использовать rotate в одном месте и не использовать rotate в другом)
  • Как сделать так, чтобы ноль исчез в качестве первой отметки оси Y на правом графике, не вводя метки вручную?
  • Как сделать так, чтобы ноль отображался в качестве первой отметки оси X на левом графике?
  • Мне нравится организация одного tikzpictureс двумя scopes внутри; однако 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}это работает (хотя я столкнулся с проблемой, описанной вПроблемы с установкой локальных шрифтов, и это решение мне помогло).

  • авто xshiftиз 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}

Связанный контент