我碰到这在想知道为什么在使用 matlab pcolor 函数时,pgfplots 似乎无法像 matlab 那样处理 nan 之后,我发了帖子。我在这种情况下的典型工作流程是:
- 在 matlab 中创建图
- 调用 matlab2tikz
- 调用一个脚本,该脚本包装 matlab2tikz 的输出以使其可编译,并写入文件。
- 编译上面输出的latex文档(预览环境,以便得到图形大小的.pdf,具有可控边框的结果)。
- 将编译产生的.pdf放置在目标路径。
目前,我想知道如何将上述文章中提出的建议融入到我的流程中(或多或少是完全自动化的)。matlab2tikz 选项extraCode
和extraAxisOptions
似乎extraTikzpictureOptions
与我相关。
暂时,我会尝试这样的方法:
MATLAB2TIKZ('extraCode','\tikzset{declare function={Ceil(\x)=round(\x+0.49999);}}',...)
但是,我不知道传递代码的机制:
opacity=Ceil(\pgfplotspointmetatransformed)
作为命令的选项\addplot3
。
总之,非常感谢关于如何以编程方式实施链接帖子中提出的修复的任何建议/意见。
答案1
简短回答
使用
matlab2tikz('filename.tex','standalone',true,'extraAxisOptions','every axis plot post/.append style={opacity=ceil(\pgfplotspointmetatransformed),shader=flat corner}')
长答案
关于你列表中的第 3 点
与实际问题无关,但值得一提:可以通过添加到选项中来matlab2tikz
输出可编译文件。使用此选项,您可以跳过列表中的第三步。'standalone',true
添加不透明度选项
正如你所说,你可以告诉使用标签向环境matlab2tikz
添加其他选项,用作axis
'extraAxisOptions'
matlab2tikz('figure.tex','extraAxisOptions','<list of options>');
此外,pgfplots
具有适用于所有图的样式,every axis plot
您可以使用它来为添加不透明度\addplot
,即
'extraAxisOptions','every axis plot post/.append style={opacity=ceil(\pgfplotspointmetatransformed)}'
请注意,无需添加
\tikzset{
declare function={Ceil(\x)=round(\x+0.49999);}
}
从pgfplots 冲浪图:不要绘制“NaN”,因为 PGF 有一个内置ceil
函数。另请注意,函数名称区分大小写,因此即使您定义了Ceil
,如果您写 ,它也不会被使用ceil(\pgfplotspointmetatransformed)
。
因此,下面的调用matlab2tikz
应该处理该部分:
matlab2tikz('filename.tex','extraAxisOptions','every axis plot post/.append style={opacity=ceil(\pgfplotspointmetatransformed)}')
着色器选择
据我所知,pgfplots
应该使用 shader=flat corner
才能pcolor
正确渲染图,而matlab2tikz
将使用shader=flat
,这与(请参阅手册)相同shader=flat mean
。因此,shader=flat corner
还应附加到every axis plot post
:
matlab2tikz('filename.tex','extraAxisOptions','every axis plot post/.append style={opacity=ceil(\pgfplotspointmetatransformed),shader=flat corner}')
最小值问题
我不太明白这一点。matlab2tikz
通常会设置point meta min
和point meta max
,在某些情况下,至少这会将值等于的单元格的不透明度设置point meta min
为 0,例如,参见下面的代码。extraAxisOptions
随着前我不point meta min
知道matlab2tikz
如何避免这样的问题,除了手动编辑代码,修改值point meta min
,如在中提到的pgfplots 冲浪图:不要绘制“NaN”。
示例代码
[X,Y] = meshgrid(1:5,1:5);
Z = randi([2,100],5,5);
for j = 1:5
% nans along diagonal
Z(j,j) = nan;
end
% explicitly set one cell to 1
Z(2,3) = 1;
figure
pcolor(X,Y,Z)
colorbar
EXTRAAXISOPTIONS = {'every axis plot post/.append style={opacity=ceil(\pgfplotspointmetatransformed),shader=flat corner}'};
matlab2tikz('test.tex','standalone',true,'extraAxisOptions', EXTRAAXISOPTIONS);
% run pdflatex
!pdflatex test.tex
% open pdf with gv (remove this line if that isn't installed)
!gv test.pdf&
输出
左边是 Matlab 图表,右边是 PDF。
上面的 Matlab 脚本生成的 LaTeX 代码:
% This file was created by matlab2tikz v0.4.7 running on MATLAB 7.14.
% Copyright (c) 2008--2014, Nico Schlömer <[email protected]>
% All rights reserved.
% Minimal pgfplots version: 1.3
%
% The latest updates can be retrieved from
% http://www.mathworks.com/matlabcentral/fileexchange/22022-matlab2tikz
% where you can also make suggestions and rate matlab2tikz.
%
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{grffile}
\pgfplotsset{compat=newest}
\usetikzlibrary{plotmarks}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}
\begin{axis}[%
width=3.68666666666667in,
height=3.47733333333333in,
view={0}{90},
scale only axis,
xmin=1,
xmax=5,
ymin=1,
ymax=5,
zmin=-1,
zmax=1,
every axis plot post/.append style={opacity=ceil(\pgfplotspointmetatransformed),shader=flat corner},
colormap/jet,
colorbar,
point meta min=1,
point meta max=99
]
\addplot3[%
surf,
shader=flat corner,
draw=black,
colormap/jet,
point meta=explicit,
mesh/rows=5]
table[row sep=crcr,header=false,meta index=3] {1 1 0 nan\\
1 2 0 60\\
1 3 0 26\\
1 4 0 67\\
1 5 0 10\\
2 1 0 63\\
2 2 0 nan\\
2 3 0 74\\
2 4 0 90\\
2 5 0 99\\
3 1 0 78\\
3 2 0 1\\
3 3 0 nan\\
3 4 0 59\\
3 5 0 3\\
4 1 0 13\\
4 2 0 87\\
4 3 0 49\\
4 4 0 nan\\
4 5 0 22\\
5 1 0 56\\
5 2 0 64\\
5 3 0 5\\
5 4 0 62\\
5 5 0 nan\\
};
\end{axis}
\end{tikzpicture}%
\end{document}
如果你修改第 34 行,则输出point meta min=0.999
结果为