Добавление произвольного кода в среду осей pgfplots до того, как будут отрисованы кривая и оси

Добавление произвольного кода в среду осей pgfplots до того, как будут отрисованы кривая и оси

Возникла некоторая путаница относительно того, что я действительно хотел, поэтому я включил сюда фактический вариант использования. MWE плюс соответствующая картинка внизу поста.

Я сделал несколько причудливых графиков, среди которых используются пользовательские линии сетки. Некоторые линии сетки не доходят до моей пользовательской оси. Каков мой наилучший шанс сделать это?

http://i.imgur.com/kIU9gjT.png

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

Оригинальный пост:Я вынужден создавать собственные линии сетки, но оси перекрывают линии сетки, когда я использую код ниже. Это приводит к тому, что часть моих линий сетки игнорируется. Я хочу рисовать их непосредственно за осями и подчиняться указанным мной координатам x. Как мне нарисовать линии до того, как будут нарисованы оси и кривая, но без перекрывающегося белого пространства, создаваемого осями?

http://i.imgur.com/8c8YjMh.png

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

решение1

Вы можете использовать execute at <begin/end> <certain events>клавиши для более последовательного вывода. Также вместо максимальной точки данных вы можете использовать axis description csдля получения всей длины оси независимо от того, где находятся точки данных.

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

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

решение2

Решение обновленного вопроса, похоже, заключается в добавлении

clip=false,

к axisокружающей среде. В вашей версии ручные горизонтальные линии сетки обрезаются за пределами исходного размера оси.

Затем вам следует также отрегулировать окончание горизонтальных линий, например:

\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);

Для лучшей видимости я изменил толщину линии thinна этом предварительном просмотре: Предварительный просмотр

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