Tikz: Desvio de posição no eixo x?

Tikz: Desvio de posição no eixo x?

Para meus dados fatoriais 2x2, quero criar um gráfico de linhas com intervalos de confiança em Tikz. As marcas do eixo x devem ter um pequeno deslocamento para que os intervalos de confiança dos dois gráficos não se sobreponham (comoposição_dodgeno ggplot2).

Meu resultado atual parece exatamente o que eu quero: Resultado atual em Tikz

No entanto, meu código é extremamente deselegante. Inseri um gráfico invisível para conseguir que as marcações do eixo x fiquem centralizadas entre os pontos de dados (veja o código abaixo).

Minha pergunta é: existe uma maneira mais elegante de conseguir esquivar de posição no Tikz, ou mesmo de criar esses gráficos de linha em geral?

\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}

Responder1

Tenho duas melhorias possíveis:

  1. seu gráfico invisível tem apenas um propósito: coletar a entrada para xtick=data. Se você escrever xtick={0.25,0.75}, não precisará mais do enredo invisível. Não sei se você quer embutir a solução em alguma solução mais avançada na qual você não conhece as posições antecipadamente... mas para o mínimo isso claramente resolve o problema.

  2. você adicionou os deslocamentos manualmente a cada coordenada. Alternativamente, você pode deixar pgfplotsesse trabalho por meio de x filter, veja o exemplo abaixo.

Aqui está o resultado com essas duas modificações:

\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}

insira a descrição da imagem aqui

informação relacionada