等高线图标记应用于普通二维图

等高线图标记应用于普通二维图

我试图获得下面手动创建的效果,用字母 表示n。现在,我知道这在轮廓图中是惯常做法,因此我查看了手册,发现确实可以使用pgfplots

在此处输入图片描述

我想:好的,你为什么不伪造一个轮廓图呢?

\documentclass{article}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{tikzpicture}[scale=0.7]
    \begin{axis}[%
grid=both,no markers,scaled ticks = false,
tick label style={/pgf/number format/.cd,fixed,precision=3},
ylabel=Sheep, xlabel = Count]
\pgfplotstableread{
xdataa    y1dataa   y2dataa 
0.0100    0.0909    0.0336
0.0120    0.0841    0.0307
0.0140    0.0777    0.0288
0.0160    0.0728    0.0258
0.0180    0.0701    0.0241
0.0200    0.0662    0.0223
0.0220    0.0627    0.0210
0.0240    0.0594    0.0200
0.0260    0.0570    0.0190
0.0280    0.0534    0.0176
0.0300    0.0509    0.0169
0.0320    0.0488    0.0160
0.0340    0.0466    0.0151
0.0360    0.0446    0.0142
0.0380    0.0429    0.0138
0.0400    0.0410    0.0132
}{\sometable}
\addplot table[x=xdataa,y=y1dataa] {\sometable};
\addplot table[x=xdataa,y=y2dataa] {\sometable};
\node[fill=white,rotate=-25,inner sep=1mm] at (15mm,34.5mm) {n};
\end{axis}
\end{tikzpicture}
\end{document}

我做不到(每当我定义该contour prepared选项时,图表就会因为某种原因消失)或者我只是盲目地看到了一些神奇的选项,但如果我成功了,这将有以下直接的缺点:

  1. 我不能包含任何非数字标签,例如n示例中的标签。
  2. 如果我必须对不同的曲线使用相同的标签,它们会由于共同的轮廓值而自动合并。

我还想出了一个解决方案,使用unbounded coords=jump选项来打破曲线。但这太丑陋了,而且太实用了(即使对我来说)。

显然,如果contour情节可以做到这一点,就必须有一种方法可以侵入机制以获取相关代码并将其转移到常规的 2D 情节案例中。我试图调整代码,但没有成功。有没有更好、更系统的方法可以减少手动劳动,尤其是添加另一列?

答案1

自 1.5.1 版起,PGFplots 可以使用 将节点放置在图形上node [pos=<pos>] {<text>}。如果您提供sloped选项,则节点将根据图形的斜率旋转。

如果出于某种原因,你只能使用旧版本,那么你可以使用decoration。这是一种名为 的样式plotlabel={<pos>}{<text>},改编自我的回答在 pgfplots 中标记图,无需手动输入坐标. 它使用在对 TikZ 中的每个路径应用后动作将后续操作应用于情节every path/.style而不会陷入循环。

图像

\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{decorations.markings}
\begin{document}
\makeatletter
\tikzset{
    nomorepostaction/.code={\let\tikz@postactions\pgfutil@empty},
    plotlabel/.style 2 args={
        every path/.append style={
            postaction={
                nomorepostaction,
                decorate,
                decoration={
                    markings,
                    mark=at position #1 with {\pgfset{inner ysep=0pt, inner xsep=1pt}
                        \pgfnode{rectangle}{east}{\color{black}#2}{}{\color{white}\pgfusepath{fill}}
                    }
                }
            }
        }
    }
}
\makeatother

\pgfplotstableread{
xdataa    y1dataa   y2dataa 
0.0100    0.0909    0.0336
0.0120    0.0841    0.0307
0.0140    0.0777    0.0288
0.0160    0.0728    0.0258
0.0180    0.0701    0.0241
0.0200    0.0662    0.0223
0.0220    0.0627    0.0210
0.0240    0.0594    0.0200
0.0260    0.0570    0.0190
0.0280    0.0534    0.0176
0.0300    0.0509    0.0169
0.0320    0.0488    0.0160
0.0340    0.0466    0.0151
0.0360    0.0446    0.0142
0.0380    0.0429    0.0138
0.0400    0.0410    0.0132
}{\sometable}

\begin{tikzpicture}
\begin{axis}[%
    grid=both,
    no markers
]
\addplot +[plotlabel={0.75}{blue}] table[x=xdataa,y=y1dataa] {\sometable};

% The following works with the PGFplots version 1.5.1 or higher 
\addplot table[x=xdataa,y=y2dataa] {\sometable} node [pos=0.5, sloped, inner xsep=1pt, inner ysep=0pt, fill=white, anchor=mid] {red};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容