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