新答案

新答案

这个问题是这是关于手动放置轮廓标签的一个pgfplots使用该选项生成的轮廓图中contour prepared。简而言之,我现在面临的问题是手动放置的轮廓标签全部为黑色(或我想要的任何其他颜色),并且与轮廓线的颜色不匹配。例如,请参阅:

在此处输入图片描述

所以我的问题是:我如何修改下面的文件,以便标签颜色与轮廓线的颜色相匹配,就像标签是由生成的一样pgfplots

我在解决方案中寻找的内容:

  1. 出于显而易见的原因,我希望颜色匹配是自动的,而不必手动完成。根据手册pgfplots,这似乎需要使用一些东西mapped color!50!black,但我无法让它工作。
  2. 如果我决定跳过标记每条轮廓线(例如,如果它们间距相等且彼此靠近),解决方案也能奏效,那就太好了。(具体来说,如果我只标记上图中的 0.5 和 1.5 级,颜色应该保持蓝色和红色 - 1.5 级不应该是橙色,因为跳过了 1.0 级。)

以下是 MWE:

\documentclass[border=5mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
  \begin{tikzpicture}[scale=1.0,
    label/.style={align=center,fill=white,inner sep=1pt,font=\tiny}]
    \begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
      \input{contour-data.tex}
      \input{contour-labels.tex}
    \end{axis}
  \end{tikzpicture}
\end{document}  

这是data.tex

\addplot[contour prepared={labels=false}]
table {
  0.500000E+00  0.000000E+00  0.500000E+00
  0.000000E+00  0.500000E+00  0.500000E+00

  0.100000E+01  0.000000E+00  0.100000E+01
  0.500000E+00  0.500000E+00  0.100000E+01
  0.000000E+00  0.100000E+01  0.100000E+01

  0.500000E+00  0.100000E+01  0.150000E+01
  0.100000E+01  0.500000E+00  0.150000E+01 
};

下面是labels.tex

\node[label,rotate=-45.0] at (axis cs: 0.250000E+00, 0.250000E+00) {0.5};
\node[label,rotate=-45.0] at (axis cs: 0.500000E+00, 0.500000E+00) {1.0};
\node[label,rotate=-45.0] at (axis cs: 0.750000E+00, 0.750000E+00) {1.5};

答案1

您似乎想知道颜色是从哪里选择的。它们来自实际的颜色图,默认情况下为colormap name=hot。激活时可以轻松将其可视化colorbar。您会在手册中找到很多,colormaps如果您愿意,甚至可以自己创建一个。

随着 PGFPlots v1.13 的新版本发布,使用手册第 193 页第 4.7.6 节中的colormap键可以轻松从中选择颜色color of colormap。缺点是,数字预计在区间 [0,1000] 内,因此您必须“手动”从 z 或元值计算它。以下是使用此新功能的代码。

\documentclass[border=2mm]{standalone}
\usepackage{tikz,pgfplots}
    \pgfplotsset{compat=1.11}
\begin{document}
    \begin{tikzpicture}[
        label/.style={
            align=center,fill=white,inner sep=1pt,font=\tiny,
            %% adds additional space in front of the text which has exactly the
            %% size of "!50!white" and is considered being a bug.
            %% (To verify that this length is added, uncomment the last node
            %%  at the end of the axis and you will notice, that the "1.5"s
            %%  are overlapping each other.)
            %text=.!40!white,     % <-- `.' equals the actual color
            %
            % to avoid this bug, just turn the color definition around
            text=white!60!.,     % <-- `.' equals the actual color
        },
    ]
        \begin{axis}[
            width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0,
            colorbar,           % just to show where the colors come from
            colormap/viridis,   % <-- change colormap
            % change min and max values of the colorbar
            point meta min=0,point meta max=2,
        ]
            \addplot[contour prepared={labels=false,}] table {
                0.500000E+00  0.000000E+00  0.500000E+00
                0.000000E+00  0.500000E+00  0.500000E+00

                0.100000E+01  0.000000E+00  0.100000E+01
                0.500000E+00  0.500000E+00  0.100000E+01
                0.000000E+00  0.100000E+01  0.100000E+01

                0.500000E+00  0.100000E+01  0.150000E+01
                0.100000E+01  0.500000E+00  0.150000E+01
            };

            \node[color of colormap=250,label,rotate=-45.0]
                at (0.250000E+00, 0.250000E+00) {0.5};
            \node[color of colormap=500,label,rotate=-45.0]
                at (0.500000E+00, 0.500000E+00) {1.0};
            \node[color of colormap=750,label,rotate=-45.0]
                at (0.750000E+00, 0.750000E+00) {1.5};

            %% to show the bug, uncomment the folowing lines and switch
            %% to the other `text' key in the definition of the `label' style
            %\node[align=center,inner sep=1pt,font=\tiny,rotate=-45.0]
            %    at (0.750000E+00, 0.750000E+00) {!40!white1.5};
        \end{axis}
    \end{tikzpicture}
\end{document}

该图显示了上述代码的结果

为了避免进行此手动计算,符号 1 的“新答案”可能是您能得到的最佳答案。

答案2

新答案

这是纯粹的 PGFPLOTS 答案。

\documentclass[border=5mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\pgfplotsset{
    label/.style={
        nodes={font=\tiny,fill=white,inner sep=1pt,text=mapped color,#1},
        point meta=explicit,nodes near coords*,nodes near coords align=
    }
}
\begin{tikzpicture}
    \begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
        \addplot[contour prepared={labels=false}]table {
            0.500000E+00  0.000000E+00  0.500000E+00
            0.000000E+00  0.500000E+00  0.500000E+00

            0.100000E+01  0.000000E+00  0.100000E+01
            0.500000E+00  0.500000E+00  0.100000E+01
            0.000000E+00  0.100000E+01  0.100000E+01

            0.500000E+00  0.100000E+01  0.150000E+01
            0.100000E+01  0.500000E+00  0.150000E+01
        };
        \addplot[label={rotate=-45}]coordinates{(0.250000E+00, 0.250000E+00)[0.5]};
        \addplot[label={rotate=-45}]coordinates{(0.500000E+00, 0.500000E+00)[1.0]};
        \addplot[label={rotate=-45}]coordinates{(0.750000E+00, 0.750000E+00)[1.5]};
    \end{axis}
\end{tikzpicture}
\end{document}

关键点是,颜色可用,就像mapped color打开了颜色计算一样。因此,point meta=explicit我触发了颜色计算。然后,nodes near coords*我有一个显示元值的节点,即您0.5的问题中的 , 。最后正确对齐节点。1.01.5nodes near coords align

请注意,1.0显示为,1因为的默认值为nodes near coords*(中的第 2859 行pgfplots.code.tex)。

nodes near coords*/.default={\pgfmathprintnumber\pgfplotspointmeta}

其中\pgfplotspointmetaFPU 编号\pgfmathprintnumber有自己的格式。你可以使用类似下面的方法更改它。

nodes near coords*={\pgfmathprintnumber[fixed zerofill]\pgfplotspointmeta}

更新

为了获得明确输出的控制,您需要表。

\documentclass[border=5mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\pgfplotsset{
    label/.style={
        nodes={font=\tiny,fill=white,inner sep=1pt,text=mapped color!50!black,#1},
        point meta=\thisrow{color},nodes near coords*={\mylabel},nodes near coords align=,
        visualization depends on=value \thisrow{label}\as\mylabel,
    }
}
\begin{tikzpicture}
    \begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
        \addplot[contour prepared={labels=false}]table {
            0.500000E+00  0.000000E+00  0.500000E+00
            0.000000E+00  0.500000E+00  0.500000E+00

            0.100000E+01  0.000000E+00  0.100000E+01
            0.500000E+00  0.500000E+00  0.100000E+01
            0.000000E+00  0.100000E+01  0.100000E+01

            0.500000E+00  0.100000E+01  0.150000E+01
            0.100000E+01  0.500000E+00  0.150000E+01
        };
        \addplot[label={rotate=-45}]table{
            x            y            color label
            0.250000E+00 0.250000E+00 0.5   {0.50}
        };
        \addplot[label={rotate=-45}]table{
            x            y            color label
            0.500000E+00 0.500000E+00 1.0   {the one!}
        };
        \addplot[label={rotate=-45}]table{
            x            y            color label
            0.750000E+00 0.750000E+00 1.5   {$\frac32$}
        };
    \end{axis}
\end{tikzpicture}
\end{document}

关于旧答案

PGFPLOTS 很难理解。所以我首先想到了这个纯 TiZ 方法。我说“这是一个有效示例”因为这种方法相当繁琐:A\spy复制整个axis环境一次。现在问自己会有多少个标签。

以下是旧答案

这是一个可行的示例。也许你可以自动化代码。

\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{fadings,spy}
\pgfplotsset{compat=1.12}
\begin{document}
    \tikzset{label/.style={circle,minimum size=10,circle,text=transparent,fill=transparent!0,font=\tiny}}
    \begin{tikzfadingfrompicture}[name=label no 1]
        \path(0,0)node[rotate=-45,label]{0.5};
    \end{tikzfadingfrompicture}
    \begin{tikzfadingfrompicture}[name=label no 2]
        \path(0,0)node[rotate=-45,label]{1.0};
    \end{tikzfadingfrompicture}
    \begin{tikzfadingfrompicture}[name=label no 3]
        \path(0,0)node[rotate=-45,label]{1.5};
    \end{tikzfadingfrompicture}
    \begin{tikzpicture}
        \begin{scope}[spy scope={circle,magnification=20,size=15}]
            \begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
                \input{data.tex}
                \coordinate(coord no 1)at(axis cs: 0.750000E+00, 0.750000E+00);
                \coordinate(coord no 2)at(axis cs: 0.500000E+00, 0.500000E+00);
                \coordinate(coord no 3)at(axis cs: 0.250000E+00, 0.250000E+00);
                \spy on(coord no 1)in node at(coord no 1);
                \spy on(coord no 2)in node at(coord no 2);
                \spy on(coord no 3)in node at(coord no 3);
            \end{axis}
        \end{scope}
        \fill[white,path fading=label no 1](coord no 1)circle(25pt);
        \fill[white,path fading=label no 2](coord no 2)circle(25pt);
        \fill[white,path fading=label no 3](coord no 3)circle(25pt);
    \end{tikzpicture}
\end{document}

分解

使用spy库来放大线条。此步骤可确保颜色匹配。

\begin{tikzpicture}
    \begin{scope}[spy scope={circle,magnification=20,size=15}]
        \begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
            \input{data.tex}
            \coordinate(coord no 1)at(axis cs: 0.750000E+00, 0.750000E+00);
            \coordinate(coord no 2)at(axis cs: 0.500000E+00, 0.500000E+00);
            \coordinate(coord no 3)at(axis cs: 0.250000E+00, 0.250000E+00);
            \spy on(coord no 1)in node at(coord no 1);
            \spy on(coord no 2)in node at(coord no 2);
            \spy on(coord no 3)in node at(coord no 3);
        \end{axis}
    \end{scope}
\end{tikzpicture}

然后准备“面具”

\tikz\path(0,0)node[rotate=-45,label,fill=black,text=white]{0.5};
\tikz\path(0,0)node[rotate=-45,label,fill=black,text=white]{1.0};
\tikz\path(0,0)node[rotate=-45,label,fill=black,text=white]{1.5};

“蒙版”应该是白色的(黑色部分应该是白色的)。并且文本被打孔(白色部分应该是透明的)。这是由fadings库实现的。

\usetikzlibrary{shadings}
\begin{tikzfadingfrompicture}[name=label no 1]
    \path(0,0)node[rotate=-45,label]{0.5};
\end{tikzfadingfrompicture}
\tikz{
    \shade[shading=color wheel](0,0)rectangle(2,2);
    \fill[white,path fading=label no 1](1,1)circle(75pt);
}

现在将它们结合在一起。

附录

通过调整不透明度,可以使标签颜色比线条颜色稍暗。

\begin{tikzpicture}
    \begin{scope}[spy scope={circle,magnification=20,size=15}]
        \begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
            \input{data.tex}
            \coordinate(coord no 1)at(axis cs: 0.750000E+00, 0.750000E+00);
            \coordinate(coord no 2)at(axis cs: 0.500000E+00, 0.500000E+00);
            \coordinate(coord no 3)at(axis cs: 0.250000E+00, 0.250000E+00);
            \spy on(coord no 1)in node at(coord no 1);
            \spy on(coord no 2)in node at(coord no 2);
            \spy on(coord no 3)in node at(coord no 3);
        \end{axis}
    \end{scope}
    \fill[black,opacity=.5](coord no 1)circle(5pt);
    \fill[black,opacity=.5](coord no 2)circle(5pt);
    \fill[black,opacity=.5](coord no 3)circle(5pt);
    \fill[white,path fading=label no 1](coord no 1)circle(25pt);
    \fill[white,path fading=label no 2](coord no 2)circle(25pt);
    \fill[white,path fading=label no 3](coord no 3)circle(25pt);
\end{tikzpicture}

相关内容