pgfplots Surfplot: Zeichne kein „NaN“

pgfplots Surfplot: Zeichne kein „NaN“

Ich habe mit matlab2tikz ein Oberflächendiagramm im Schachbrettstil erstellt. Die Daten enthalten NAN-Werte (keine Zahlen). Ich möchte, dass die Quadrate der NAN-Werte weiß sind (wie in Matlab). Beim Kompilieren erhalte ich die folgende Warnung:

Paket pgfplots Warnung: Die Metadaten pro Punkt „nan“ (3Y0.0e0]) (und wahrscheinlich auch andere) sind unbegrenzt – stattdessen wird der Mindestwert verwendet. in Eingabezeile 58.

und das Quadrat wird mit der Farbe für '0' gefüllt. Ich habe versucht, die Nanowerte zu überspringen, indem ich

unbounded coords=discard

Die Warnung und das Verhalten blieben gleich. Beim Entfernen der Nanowerte scheint das Quadrat die Farbe seines Nachbarn anzunehmen.

Hier ist der von matlab2tikz generierte Code:

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

Und hier die Ausgabe: Bildbeschreibung hier eingeben

Gibt es eine Möglichkeit, die Quadrate nicht mit Nanowerten zu zeichnen? Oder der kontinuierlichen Farbkarte eine diskrete Farbe hinzuzufügen, sodass Nanowerte in Weiß gezeichnet werden?

Antwort1

Ich habe eine schnelle und einfache Lösung für das Problem gefunden.

Anstatt zu verhindern, dass NAN-Felder gezeichnet werden, habe ich sie transparent dargestellt. Dazu habe ich die Deckkraft der Felder abhängig von den Punktmetadaten eingestellt. Die Deckkraft muss für NAN-Felder = 0 und für andere Felder >= 1 sein.

Daher muss der Wert point meta minetwas niedriger sein als der kleinste Punkt-Metawert (abhängig von der numerischen Auflösung), sodass ceil(pgfplotspointmetatransformed)>= 1 für den Punkt mit den kleinsten Punkt-Meta ist.

Die Deckkraft wird dann auf gesetzt opacity = ceil(\pgfplotspointmetatransformed). (ceil muss definiert werden) Da pgfplots alle Nanopunkt-Metawerte auf setzt point meta min, erscheinen sie transparent. Beachten Sie, dass für Nanopunkte kein Rahmen gezeichnet wird.

Hier ist der Code:

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

Und hier die Ausgabe: Bildbeschreibung hier eingeben

Antwort2

Ich habe keine Antwort, hätte aber für ein einfaches Streudiagramm auch gerne Folgendes:

(Beispiel mit dem im Kommentar vorgeschlagenen Code geändert, es funktioniert!)

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

Ich möchte den zweiten Punkt überhaupt nicht zeichnen (aber ich möchte trotzdem die Koordinaten dort haben, da ich möchte, dass sie in anderen \addplotBefehlen gezeichnet werden).

verwandte Informationen