pgfplots 冲浪图:不要绘制“NaN”

pgfplots 冲浪图:不要绘制“NaN”

我使用 matlab2tikz 生成了棋盘格样式的表面图。数据包含 nan(不是数字)值。我希望 nan 值的方块为白色(如在 matlab 中一样)。编译时,我收到以下警告:

包 pgfplots 警告:每个点元数据“nan”(3Y0.0e0])(可能还有其他数据)是无界的 - 而是使用最小值。在输入行 58。

并且正方形填充了“0”的颜色。我尝试使用以下方法跳过 nan 值:

unbounded coords=discard

警告和行为保持不变。删除 nan 值时,正方形似乎会采用其邻居的颜色。

以下是 matlab2tikz 生成的代码:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}

\begin{tikzpicture}

\begin{axis}[%
view={0}{90},
scale only axis,
xmin=1, xmax=5,ymin=1,ymax=5,zmin=-1,zmax=1,
hide axis,
colormap/jet,
colorbar,
point meta min=1,
point meta max=100
]

\addplot3[%
surf,
shader=flat corner,
draw=black,
colormap/jet,
point meta=explicit,
%unbounded coords=discard,
mesh/rows=5]
table[row sep=crcr,header=false,meta index=3] {
    1   1   0   1  \\
    1   2   0   10  \\
    1   3   0   20  \\
    1   4   0   30  \\
    1   5   0   1  \\
    2   1   0   40  \\
    2   2   0   nan  \\
    2   3   0   50  \\
    2   4   0   60   \\
    2   5   0   1  \\
    3   1   0   70  \\
    3   2   0   80  \\
    3   3   0   90   \\
    3   4   0   nan  \\
    3   5   0   1  \\
    4   1   0   75  \\
    4   2   0   80  \\
    4   3   0   85  \\
    4   4   0   100  \\
    4   5   0   1  \\
    5   1   0   1  \\
    5   2   0   1  \\
    5   3   0   1   \\
    5   4   0   1   \\
    5   5   0   1   \\
};
\end{axis}
\end{tikzpicture}

\end{document}

输出如下: 在此处输入图片描述

有没有办法不绘制带有 nan 值的方块?或者在连续颜色图中添加离散颜色,以便将 nan 值绘制为白色?

答案1

我找到了解决这个问题的一个快速而又简单的方法。

我没有阻止绘制 nan 字段,而是将它们渲染为透明。为此,我根据点元数据设置了字段的不透明度。对于 nan 字段,不透明度必须为 = 0,对于其他字段,不透明度必须为 >= 1。

因此,的值point meta min必须略低于最小点元值(取决于数值分辨率),以便ceil(pgfplotspointmetatransformed)对于具有最小点元的点,> = 1。

然后将不透明度设置为opacity = ceil(\pgfplotspointmetatransformed)。(必须定义 ceil)由于 pgfplots 将所有 nan 点元值设置为point meta min,因此它们看起来是透明的。请注意,不会为 nan 字段绘制边框。

代码如下:

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\begin{document}

\tikzset{
    declare function={Ceil(\x)=round(\x+0.49999);}
}

\begin{tikzpicture}

    \begin{axis}[%
        view={0}{90},
        scale only axis,
        xmin=1, xmax=5,ymin=1,ymax=5,zmin=-1,zmax=1,
        hide axis,
        colormap/jet,
        colorbar,
        point meta min=0.999999,
        point meta max=100
    ]

    \addplot3[%
        surf,
        shader=flat corner,
        draw=black,
        colormap/jet,
        point meta=explicit,
        opacity=Ceil(\pgfplotspointmetatransformed),
        mesh/rows=5
    ]
    table[row sep=crcr,header=false,meta index=3] {
        1   1   0   1  \\
        1   2   0   10  \\
        1   3   0   20  \\
        1   4   0   30  \\
        1   5   0   1  \\
        2   1   0   40  \\
        2   2   0   nan  \\
        2   3   0   50  \\
        2   4   0   60   \\
        2   5   0   1  \\
        3   1   0   70  \\
        3   2   0   80  \\
        3   3   0   90   \\
        3   4   0   nan  \\
        3   5   0   1  \\
        4   1   0   75  \\
        4   2   0   80  \\
        4   3   0   85  \\
        4   4   0   100  \\
        4   5   0   1  \\
        5   1   0   1  \\
        5   2   0   1  \\
        5   3   0   1   \\
        5   4   0   1   \\
        5   5   0   1   \\
};
\end{axis}
\end{tikzpicture}

\end{document}

输出如下: 在此处输入图片描述

答案2

我没有答案,但我也喜欢这个,一个简单的散点图:

(使用评论中建议的代码修改的示例,它有效!)

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[scatter,
         only marks,
         point meta=explicit,
         point meta min=0,
         unbounded coords=discard,
         filter point/.code={
           \pgfmathparse{\pgfkeysvalueof{/data point/meta}}
           \let\A=\pgfmathresult
           \pgfmathfloatgetflagstomacro\A\flags
           \ifnum\flags=3
             \pgfkeyssetvalue{/data point/x}{nan}
           \fi
         },
] table[row sep=crcr,header=false,meta index=2] {
1 1 20 \\
2 2 nan \\
3 3 50 \\
4 4 100 \\
};
\end{axis}
\end{tikzpicture}
\end{document}

我根本不想画出第二个点(但我仍然希望在那里有坐标,因为我希望它在其他位置绘制\addplot命令中绘制出来)。

相关内容