pgfplots surf plot: не рисовать 'NaN'

pgfplots surf plot: не рисовать '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, я сделал их прозрачными. Для этого я установил непрозрачность полей в зависимости от метаданных точки. Непрозрачность должна быть = 0 для полей nan и >= 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командах).

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