我知道这是对这个问题的迟到答复,但我想我会为正在发生的事情提供解释,以防万一将来有人遇到此问题。
这里的基本问题是 EPS 文件本身不支持透明度(这就是 export_fig 没有产生不同结果的原因)。 MATLAB 意识到了这一点,因此当您尝试使用透明度打印图形时,它会尽力重新创建屏幕上的图像。不幸的是,它也失败了。
让我们举一个非常简单的例子。我们将创建一个红色的surf 并使其每个元素都有不同的Alpha 值。
% Surface with random transparency between 0 (transparent) and 1 (opaque)
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', rand(10), 'FaceAlpha', 'flat');
现在让我们保存一个 PNG 和 EPS 版本并检查它们。
还不错吧?看起来在 PNG 和 EPS 版本之间保留了透明度。这几乎是正确的,除非我们将表面定义为完全透明。在这些区域中,MATLAB 实际上用 solid red 代替了这些区域。更简单地说,在 PNG 中完全是白色的区域中,它们在 EPS 中是完全红色的。
为了进一步证明这一点,让我们创建一个表面,其中AlphaData 是0(完全透明)或0.1(大部分透明)。
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', eye(10)/10, 'FaceAlpha', 'flat');
好的,现在我们可以看到,如果我们将某些东西定义为完全透明,MATLAB 甚至不会尝试使某些东西透明。它的作用恰恰相反。另一方面,半透明区域似乎仍然是半透明的。它们真的是透明的吗?
要确定这里是否真的存在透明度,让我们先回到第一个示例。让我们尝试将axes 颜色更改为黑色,这样我们就可以看到它是否真的是透明的。
set(gca, 'Color', 'k')
以及保存为 PNG 和 EPS 时的结果
这很有趣……那么这里到底发生了什么。正如我之前所说,MATLAB 知道 EPS 无法包含透明度信息。它还知道您的图形包含透明度,并且希望以某种方式包含此信息。它执行此操作的方式是,它使用 预期背景颜色(白色)抖动您的颜色,以创建透明的 外观。不幸的是,如果您的透明对象下有任何东西不是白色的,那么您将看不到它,因为在一天结束时,更透明的区域只是更白,实际上并不更透明。
对于像这样可变透明的数据,这确实是个问题,唯一的解决方法是将其保存为确实支持透明度的格式,或者您可以在 EPS 编辑器中打开生成的 EPS 文件,更改那里的绘图对象的透明度,然后以不同的格式重新导出。
另一方面,如果您没有具有变量透明度的绘图对象,而是具有不透明或透明区域的绘图对象,则存在一种解决方法。
您实际上可以做的是将透明面的FaceColor 设置为NaN。这将导致该特定面甚至无法渲染,并且 MATLAB 在打印到文件时将忽略该面。
% Make everything but the diagonal be NaN (transparent)
cdata = ones(10);
cdata(~eye(10)) = NaN;
% Create a surface with no transparency and just CData with NaN values
surf(zeros(10), 'FaceColor', 'flat', 'CData', cdata);
% Change axes color to check transparency
set(gca, 'Color', 'k')
现在 PNG 和 EPS 都能够成功地在下方显示彩色 axes,这意味着对角线之外的所有内容在 PNG 和 EPS 中都是功能透明的。无论是下面的 axes 还是还有其他绘图对象,这都有效。
现在,回到您发布的问题。不幸的是,您的图像的链接不再有效,但如果您打开创建的 EPS 文件,您可能会看到图像 在黄色/绿色表面下方,这只是表面使用透明度和 MATLAB 强制透明区域不透明,而是用白色抖动。当您查看生成的 EPS 文件时,该实体表面会覆盖下方的图像,使其看起来好像消失了。如果您将透明表面元素更改为具有CData 值NaN,那么您将能够通过这些位置的表面看到图像。