Для моих 2x2 факторных данных я хочу создать линейный график с доверительными интервалами в Tikz. Предполагается, что отметки оси x будут иметь небольшое смещение, чтобы доверительные интервалы двух графиков не перекрывались (какпозиция_уклоненияв ggplot2).
Мой текущий результат выглядит именно так, как я хочу:
Однако мой код крайне неэлегантен. Я вставил невидимый график, чтобы добиться того, чтобы отметки оси x были центрированы между точками данных (см. код ниже).
У меня такой вопрос: есть ли более элегантный способ добиться уклонения от позиции в Tikz или даже создать такие линейные графики в целом?
\documentclass{article}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
grid = major,
ylabel = Response time (ms),
xlabel = Prime valence,
xtick = data,
xmin = 0,
xmax = 1,
xticklabels = {negative,positive},
legend style = {at={(1.2,0.5)},
anchor = center}
]
\addplot[white] plot % invisible plot to center the labels
coordinates {
(0.25,750)
(0.75,750)
};
\addlegendentry{}
\addplot[red,mark=square*] plot[error bars/.cd, y dir=both, y explicit]
coordinates {
(0.22,769) +- (0,15) % manual dodge for each data point
(0.72,764) +- (0,15)
};
\addlegendentry{negative}
\addplot[green,mark=square*] plot[error bars/.cd, y dir=both, y explicit]
coordinates {
(0.28,746) +- (0,15)
(0.78,716) +- (0,15)
};
\addlegendentry{positive}
\end{axis}
\end{tikzpicture}
\end{document}
решение1
У меня есть два возможных улучшения:
Ваш невидимый график имеет только одну цель, а именно, собрать входные данные для
xtick=data
. Если вы напишетеxtick={0.25,0.75}
, вам больше не нужен невидимый график. Я не знаю, хотите ли вы встроить решение в какое-то более продвинутое решение, в котором вы заранее не знаете позиции... но для минимального это явно решает проблему.вы добавили смещения вручную к каждой координате. В качестве альтернативы вы можете позволить
pgfplots
сделать эту работу с помощьюx filter
, см. пример ниже.
Вот результат с этими двумя модификациями:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
grid = major,
ylabel = Response time (ms),
xlabel = Prime valence,
xtick = {0.25,0.75},
xmin = 0,
xmax = 1,
xticklabels = {negative,positive},
legend style = {at={(1.2,0.5)},
anchor = center}
]
\addplot[red,mark=square*,
% manual dodge for each data point
x filter/.code={\pgfmathparse{\pgfmathresult-0.03}}
] plot[error bars/.cd, y dir=both, y explicit]
coordinates {
(0.25,769) +- (0,15)
(0.75,764) +- (0,15)
};
\addlegendentry{negative}
\addplot[green,mark=square*,
% manual dodge for each data point
x filter/.code={\pgfmathparse{\pgfmathresult+0.03}}
] plot[error bars/.cd, y dir=both, y explicit]
coordinates {
(0.25,746) +- (0,15)
(0.75,716) +- (0,15)
};
\addlegendentry{positive}
\end{axis}
\end{tikzpicture}
\end{document}