
Houve alguma confusão sobre o que eu realmente queria, então incluo aqui o caso de uso real. A imagem correspondente do MWE plus está na parte inferior da postagem.
Fiz alguns gráficos sofisticados, entre os quais usei linhas de grade personalizadas. Algumas das linhas de grade não vão até o meu eixo definido personalizado. Qual é a minha melhor chance de fazer isso?
\documentclass{standalone}
\usepackage{pgf}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\usepackage{tikz}
\usetikzlibrary{arrows,calc,shapes, positioning}
\tikzset{
shadowed/.style={preaction={
transform canvas={shift={(2pt,-1pt)}},draw opacity=.2,#1,preaction={
transform canvas={shift={(4pt,-1.75pt)}},draw opacity=.1,#1,preaction={
transform canvas={shift={(6pt,-2.5pt)}},draw opacity=.05,#1,preaction={
transform canvas={shift={(8pt,-3.25pt)}},draw opacity=.025,#1,
}
}}}},
}
\makeatletter
\def\pgfplotsdataxmin{\pgfplots@data@xmin}
\def\pgfplotsdataxmax{\pgfplots@data@xmax}
\def\pgfplotsdataymin{\pgfplots@data@ymin}
\def\pgfplotsdataymax{\pgfplots@data@ymax}
\makeatother
\pgfplotsset{
range frame/.style={
tick align=outside,
axis line style={opacity=0},
after end axis/.code={
\draw[cyan,thick,double=white,double distance=1.4pt,line cap=round,rounded corners] ({rel axis cs:0,0}-|{axis cs:\pgfplotsdataxmax,0}) -- ({rel axis cs:0,0}-|{axis cs:\pgfplotsdataxmin,0}) -- ({rel axis cs:0,0}|-{axis cs:0,\pgfplotsdataymin}) -- ({rel axis cs:-.1,0}|-{axis cs:0,\pgfplotsdataymax});
}
}
}
\begin{document}
\begin{tikzpicture}[scale=2]
\begin{axis}[range frame,
domain=25.29325198:97,
axis lines*=left,
yticklabel=\empty,
xticklabels=\empty,
xtick style={draw=none},
ytick style={draw=none},
extra description/.code={%
\node[] at (axis cs:6,60) {$60$};
\node[] at (axis cs:8.6,40) {$40$};
\node[] at (axis cs:11.5,20) {$20$};
\node[] at (axis cs:15,0) {$0$};
\node[] at (axis cs:25,-11.3) {$25$};
\node[] at (axis cs:50,-11.3) {$50$};
\node[] at (axis cs:75,-11.3) {$75$};
\draw[ultra thin,lightgray] (axis cs:25,-9) -- (axis cs:25,-7);
\draw[ultra thin,lightgray] (axis cs:50,-9) -- (axis cs:50,-7.5);
\draw[ultra thin,lightgray] (axis cs:75,-9) -- (axis cs:75,-7.5);
\node[] at (axis cs:\pgfplotsdataxmin-15.5,\pgfplotsdataymax+4.4) {$m_\mathrm{gr}$};
\node[] at (axis cs:\pgfplotsdataxmax+5.5,\pgfplotsdataymin-7) {$m_\mathrm{f}$};
}
]
\draw[ultra thin,lightgray] (axis cs:-8.05,20) -- (axis cs:\pgfplotsdataxmax,20);
\draw[ultra thin,lightgray] (axis cs:-8.05,0) -- (axis cs:\pgfplotsdataxmax,0);
\draw[ultra thin,lightgray] (axis cs:-8.05,40) -- (axis cs:\pgfplotsdataxmax,40);
\draw[ultra thin,lightgray] (axis cs:-8.05,60) -- (axis cs:\pgfplotsdataxmax,60);
\addplot[shadowed={double=gray,draw=gray},thick,line cap=round,rounded corners, draw=purple,double=white,double distance=1.6pt,
] {-23.73194+0.9382716*x};
\end{axis}
\end{tikzpicture}
\makeatother
\end{document}
Postagem original:Sou forçado a produzir minhas próprias linhas de grade, mas os eixos se sobrepõem às linhas de grade quando uso o código abaixo. Isso faz com que uma parte das minhas linhas de grade seja ignorada. Desejo desenhá-los diretamente atrás dos eixos e obedecer às minhas coordenadas x especificadas. Como posso desenhar as linhas antes de os eixos e a curva serem desenhados, mas sem os espaços em branco sobrepostos produzidos pelos eixos?
\documentclass{standalone}
\usepackage{pgfplots}
\makeatletter
\begin{document}
\begin{tikzpicture}[scale=2]
\begin{axis}[
extra description/.code={%preaction={ %preaction doesn't work
},%}
]
\draw[ultra thick,lightgray] (axis cs:-2,2) -- (axis cs:\pgfplots@data@xmax,2);
\draw[ultra thick,lightgray] (axis cs:.04,4) -- (axis cs:\pgfplots@data@xmax,4);
\draw[ultra thick,lightgray] (axis cs:0,6) -- (axis cs:\pgfplots@data@xmax,6);
\addplot[
] table {
dof l2_err level
.2 2.6 2
.4 2.3 4
.5 2.4 5
.6 1.1 6
.7 1.8 7
.8 4.6 8
.9 3.3 9
1 6.2 10
};
\end{axis}
\end{tikzpicture}
\makeatother
\end{document}
Responder1
Você pode usar as execute at <begin/end> <certain events>
teclas para obter uma saída mais consistente. Além disso, em vez do ponto de dados máximo, você pode usar axis description cs
para obter todo o comprimento do eixo, independente de onde os pontos de dados estão.
\documentclass{standalone}
\usepackage{pgfplots}
\makeatletter
\pgfplotsset{compat=1.11,
my extras/.style={
execute at begin axis={
\draw[ultra thick,lightgray] (axis cs:.08,2) -- (axis cs:\pgfplots@data@xmax,2);
\draw[ultra thick,lightgray] (axis cs:.04,4) -- (axis cs:\pgfplots@data@xmax,4);
\draw[ultra thick,lightgray] (axis cs:0,6) -- (axis cs:\pgfplots@data@xmax,6);
}
}
}
\makeatother
\begin{document}
\begin{tikzpicture}[scale=2]
\begin{axis}[my extras]
\addplot+[ultra thick,
] table {
dof l2_err level
.2 2.6 2
.4 2.3 4
.5 2.4 5
.6 1.1 6
.7 1.8 7
.8 4.6 8
.9 3.3 9
1 6.2 10
};
\end{axis}
\end{tikzpicture}
\end{document}
Responder2
A solução da questão atualizada parece estar adicionando
clip=false,
Para o axis
ambiente. Na sua versão, as linhas de grade horizontais manuais são cortadas fora do tamanho original do eixo.
Você também deve ajustar o final das linhas horizontais, por exemplo:
\draw[ultra thin,lightgray] (axis cs:17,0) -- (axis cs:\pgfplotsdataxmax,0);
\draw[ultra thin,lightgray] (axis cs:14.3,20) -- (axis cs:\pgfplotsdataxmax,20);
\draw[ultra thin,lightgray] (axis cs:11.6,40) -- (axis cs:\pgfplotsdataxmax,40);
\draw[ultra thin,lightgray] (axis cs:9,60) -- (axis cs:\pgfplotsdataxmax,60);
Para melhor visibilidade, alterei a largura da linha thin
nesta visualização: