
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이어야 하고 다른 필드의 경우 >= 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
).