我已经创建了以下格式的文件(workfile.dat):
<x1> >y1> <z>
<x1> >y2> <z>
<x1> >y3> <z>
<x2> >y1> <z>
<x2> >y2> <z>
<x2> >y3> <z>
etc.
我已经创建了一个 surf pgf:
使用以下代码:
\begin{tikzpicture}
\begin{axis}[view={0}{90},colormap/cool]
\addplot3[surf] table [row sep=newline] {./workfile.dat};
\end{axis}
\end{tikzpicture}
我希望值为<z>
null 的地方是白色的,而不是像上图那样。我希望它看起来像这样:
这意味着 x 轴以小数点后两位的十进制格式表示,y 轴从 0 到 1(而不是 0 到 400)。
此外,我想知道是否可以在 tikz pgf 中像在 matplotlib 中一样对颜色条使用 LogNorm。
编辑
下面是我所做事情的一个例子:
\documentclass[a4paper,10pt]{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={0}{90},
colormap/cool,
y filter/.code=\pgfmathparse{\pgfmathresult/400}]
\addplot3[surf] table [row sep=newline] {./workfile.dat};
\end{axis}
\end{tikzpicture}
\end{document}
这是我得到的输出:
蓝线似乎是正确的,但我无法解释 = 0 处的灰色背景。
编辑2
新示例:
文件数据 workfile.dat
1 1 0
1 2 0
2 1 0
2 2 1
输出
代码:
\documentclass[a4paper,10pt]{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[view={0}{90},
colormap/cool,
]
\addplot3[surf] table [row sep=newline] {./workfile_2.dat};
\end{axis}
\end{tikzpicture}
\end{document}
如您所见,输入数据中只有一个元素的值为“1”,但整个区域都是蓝色。
答案1
根据定义,曲面图 ( surf
) 总是用 的“合适”颜色填充整个区域colormap
。这里,完全的表示轴的背景(白色)不再可见。
为了看到“白色”,您必须确定表面图是否真的是您想要的。如果事实证明这是真的(根据您的问题,似乎确实如此),您主要有一个选择:即定义一个颜色图,其中 z=0 的值恰好被映射到白色。
但是,如果您只是想查看背景颜色(白色)并希望看到几条固定高度的线条,那么最好使用轮廓图。我建议您使用轮廓图,因为它看起来更接近您的第二张 2d 图片:
\documentclass[a4paper]{article}
\usepackage{pgfplots}
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}
\begin{axis}[view={0}{90},
colormap/cool,
colorbar,
]
\addplot3[contour gnuplot] table [row sep=newline] {
1 1 0
1 2 0
2 1 0
2 2 1
};
\end{axis}
\end{tikzpicture}
\end{document}
如果你确实想要一个surf
情节,你仍然可以按如下方式进行:
这是定义“合适”的初步尝试colormap
- 即,您有一个surf
图,其中 z=0 恰好获得白色:
\documentclass[a4paper]{article}
\usepackage{pgfplots}
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}
\begin{axis}[view={0}{90},
colormap={custom}{color(0)=(red) color(2)=(white) color(4)=(blue)},
colorbar,
]
\addplot3[surf,shader=interp] table [row sep=newline] {
1 1 0
1 2 0
2 1 0
2 2 1
};
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[view={0}{90},
colormap={custom}{color(0)=(red) color(1)=(white) color(2)=(green) color(4)=(blue)},
colorbar,
]
\addplot3[surf,shader=interp] table [row sep=newline] {
1 1 0
1 2 0
2 1 0
2 2 1
};
\end{axis}
\end{tikzpicture}
\end{document}
在这种方法中,您可能需要选择正确的值shader
(我的选择有效,另一个合适的值可能flat corner
适合您的应用程序)。
我相信等高线图解决方案可能会更好(对于这个应用程序来说工作量更少、更漂亮 - 只要您计算的数据轮廓足够好)。