
Я сгенерировал график поверхности в стиле шахматной доски с помощью 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
командах).