我使用 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 字段,而是将它们渲染为透明。为此,我根据点元数据设置了字段的不透明度。对于 nan 字段,不透明度必须为 = 0,对于其他字段,不透明度必须为 >= 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
命令中绘制出来)。