Gráfico de navegación de pgfplots: no dibujes 'NaN'

Gráfico de navegación de pgfplots: no dibujes 'NaN'

Generé un diagrama de superficie estilo tablero de ajedrez usando matlab2tikz. Los datos contienen valores nan (no un número). Quiero que los cuadrados de los valores nan sean blancos (como en matlab). Cuando compilo, aparece la siguiente advertencia:

Paquete pgfplots Advertencia: Los metadatos por punto `nan' (3Y0.0e0]) (y probablemente también otros) no están limitados; en su lugar se utiliza el valor mínimo. en la línea de entrada 58.

y el cuadrado se rellena con el color de '0'. Intenté omitir los valores nan usando

unbounded coords=discard

La advertencia y el comportamiento siguieron siendo los mismos. Al eliminar los valores nan, el cuadrado parece tomar el color de su vecino.

Aquí está el código generado 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}

Y aquí el resultado: ingrese la descripción de la imagen aquí

¿Hay alguna manera de no dibujar los cuadrados con valores nan? ¿O agregar un color discreto al mapa de colores continuo para que los valores nan se dibujen en blanco?

Respuesta1

He encontrado una solución rápida y sucia al problema.

En lugar de evitar que se dibujaran nan campos, los hice transparentes. Para hacerlo, configuro la opacidad de los campos según los metadatos del punto. La opacidad debe ser = 0 para nan campos y >= 1 para otros campos.

Por lo tanto, el valor de point meta mintiene que ser ligeramente inferior al valor meta de punto más pequeño (dependiendo de la resolución numérica), de modo que ceil(pgfplotspointmetatransformed)>= 1 para el punto con el meta valor de punto más pequeño.

Luego la opacidad se establece en opacity = ceil(\pgfplotspointmetatransformed). (el techo debe estar definido) Dado que pgfplots establece todos los metavalores de nan puntos en point meta min, aparecen transparentes. Tenga en cuenta que el borde no se dibuja para los campos nan.

Aquí está el 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}

Y aquí el resultado: ingrese la descripción de la imagen aquí

Respuesta2

No tengo una respuesta, pero también me gustaría esto, para un diagrama de dispersión simple:

(Ejemplo modificado con el código sugerido en el comentario, ¡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}

No quiero que se dibuje el segundo punto en absoluto (pero aun así quiero tener las coordenadas allí, ya que quiero que se dibuje en otros \addplotcomandos).

información relacionada