Tikz: Позиционировать уклонение по оси x?

Tikz: Позиционировать уклонение по оси x?

Для моих 2x2 факторных данных я хочу создать линейный график с доверительными интервалами в Tikz. Предполагается, что отметки оси x будут иметь небольшое смещение, чтобы доверительные интервалы двух графиков не перекрывались (какпозиция_уклоненияв ggplot2).

Мой текущий результат выглядит именно так, как я хочу: Текущий результат в Tikz

Однако мой код крайне неэлегантен. Я вставил невидимый график, чтобы добиться того, чтобы отметки оси 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

У меня есть два возможных улучшения:

  1. Ваш невидимый график имеет только одну цель, а именно, собрать входные данные для xtick=data. Если вы напишете xtick={0.25,0.75}, вам больше не нужен невидимый график. Я не знаю, хотите ли вы встроить решение в какое-то более продвинутое решение, в котором вы заранее не знаете позиции... но для минимального это явно решает проблему.

  2. вы добавили смещения вручную к каждой координате. В качестве альтернативы вы можете позволить 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}

введите описание изображения здесь

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