pgfplots surf plot: não desenhe 'NaN'

pgfplots surf plot: não desenhe 'NaN'

Eu gerei um gráfico de superfície em estilo tabuleiro de xadrez usando matlab2tikz. Os dados contêm valores nan (não um número). Quero que os quadrados dos valores nan sejam brancos (como no matlab). Quando compilo, recebo o seguinte aviso:

Pacote pgfplots Aviso: Os metadados por ponto `nan' (3Y0.0e0]) (e provavelmente outros também) são ilimitados - usando o valor mínimo. na linha de entrada 58.

e o quadrado é preenchido com a cor '0'. Tentei pular os valores nan usando

unbounded coords=discard

O aviso e o comportamento permaneceram os mesmos. Ao remover os valores nan, o quadrado parece assumir a cor do seu vizinho.

Aqui está o código gerado por 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}

E aqui a saída: insira a descrição da imagem aqui

Existe uma maneira de não desenhar quadrados com valores nan? Ou adicionar uma cor discreta ao mapa de cores contínuo para que os valores nan sejam desenhados em branco?

Responder1

Eu encontrei uma solução rápida e suja para o problema.

Em vez de impedir que nan campos fossem desenhados, tornei-os transparentes. Para fazer isso, defino a opacidade dos campos dependendo dos metadados do ponto. A opacidade deve ser = 0 para nan campos e >= 1 para outros campos.

Portanto, o valor de point meta mindeve ser ligeiramente inferior ao menor valor do ponto meta (dependendo da resolução numérica), de modo que ceil(pgfplotspointmetatransformed)>= 1 para o ponto com o menor ponto meta.

A opacidade é então definida como opacity = ceil(\pgfplotspointmetatransformed). (o teto deve ser definido) Como o pgfplots define todos os valores meta de nan pontos como point meta min, eles parecem transparentes. Observe que a borda não é desenhada para nan campos.

Aqui está o código:

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

E aqui a saída: insira a descrição da imagem aqui

Responder2

Não tenho uma resposta, mas também gostaria disso, para um gráfico de dispersão simples:

(Exemplo modificado com o código sugerido no comentário, funciona!)

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

Não quero que o segundo ponto seja desenhado (mas ainda quero ter as coordenadas lá, pois quero que sejam desenhadas em outros \addplotcomandos).

informação relacionada