
Hubo cierta confusión sobre lo que realmente quería, por lo que incluyo aquí el caso de uso real. La imagen correspondiente de MWE plus se encuentra al final de la publicación.
Hice un gráfico de aspecto elegante, entre los que utilizo líneas de cuadrícula personalizadas. Algunas de las líneas de la cuadrícula no llegan hasta mi eje definido personalizado. ¿Cuál es mi mejor oportunidad para lograrlo?
\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}
Publicación original:Me veo obligado a producir mis propias líneas de cuadrícula, pero los ejes se superponen a las líneas de la cuadrícula cuando uso el siguiente código. Esto hace que se ignore una parte de las líneas de mi cuadrícula. Deseo dibujarlos directamente detrás de los ejes y obedecer mis coordenadas x especificadas. ¿Cómo puedo dibujar las líneas antes de dibujar los ejes y la curva, pero sin el espacio en blanco superpuesto producido por los ejes?
\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}
Respuesta1
Puede utilizar las execute at <begin/end> <certain events>
teclas para obtener una salida más consistente. Además, en lugar del punto de datos máximo, puede utilizarlo axis description cs
para obtener la longitud total del eje independientemente de dónde estén los puntos de datos.
\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}
Respuesta2
La solución de la pregunta actualizada parece ser agregar
clip=false,
para el axis
medio ambiente. En su versión, las líneas de la cuadrícula horizontal manual se recortan fuera del tamaño original del eje.
Luego también deberías ajustar el final de las líneas horizontales, por ejemplo:
\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 una mejor visibilidad, cambié el ancho de la línea thin
en esta vista previa: