我知道这是对这个问题的迟到回复,但我想提供一个解释,以防将来有人遇到此问题。
基本问题在于EPS文件不支持透明度(这就是为什么
export_fig
没有产生不同结果的原因)。MATLAB意识到了这一点,因此当你尝试使用透明度打印图形时,它会尽力重新创建你屏幕上的图像。不幸的是,它也失败了。
所以让我们举一个非常简单的例子。我们将创建一个红色的
surf
并使每个元素具有不同的
Alpha
值。
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', rand(10), 'FaceAlpha', 'flat');
现在让我们保存PNG和EPS版本并查看它们。
![enter image description here](https://istack.dev59.com/AkA7Dm.webp)
不错,对吧?PNG和EPS版本之间的透明度似乎得到了保留。这大多是正确的,除非我们将表面定义为
完全透明的区域。在这些区域中,MATLAB实际上用
纯色红色替换了这些区域。更简单地说,在PNG中完全为白色的区域在EPS中完全为红色。
为了进一步说明这一点,让我们创建一个表面,其中
AlphaData
为
0
(完全透明)或
0.1
(大部分透明)。
surf(zeros(10), 'FaceColor', 'r', 'AlphaData', eye(10)/10, 'FaceAlpha', 'flat');
![enter image description here](https://istack.dev59.com/Ll5H9m.webp)
好的,现在我们可以看到,如果我们将某些东西定义为完全透明,MATLAB甚至不会尝试使其透明。它做的恰恰相反。另一方面,半透明区域似乎仍然是半透明的。它们实际上是透明的吗?
为了确定这里是否真的有透明度,请回到第一个示例。让我们尝试将axes
颜色更改为黑色,以便我们可以看到它是否真的是透明的。
set(gca, 'Color', 'k')
并且保存为PNG和EPS格式后的结果
![enter image description here](https://istack.dev59.com/NSP21m.webp)
很有趣...那么这里到底发生了什么呢?就像我之前说的,MATLAB 知道 EPS 无法包含透明信息。它也知道你的图形包含透明度,并希望以某种方式包含此信息。它所做的是使用
预期背景颜色(白色)抖动您的颜色,以创建透明的
外观。不幸的是,如果您在透明对象下方有任何
不是白色的东西,您将看不到它,因为最终更透明的区域只是更白而
并非实际上更透明。
对于这样可变透明度的数据,这是一个相当大的问题,真正的解决方法只能将其保存为支持透明度的格式,或者您可以在 EPS 编辑器中打开生成的 EPS 文件,在那里更改情节对象的透明度,然后重新导出为不同的格式。
另一方面,如果您没有具有可变透明度的情节对象,而是具有不透明或透明区域的对象,则有一个解决方法。
你可以将透明面的
FaceColor
设置为
NaN
。这将导致特定面甚至不被渲染,当打印文件时MATLAB会忽略该面。
cdata = ones(10);
cdata(~eye(10)) = NaN;
surf(zeros(10), 'FaceColor', 'flat', 'CData', cdata);
set(gca, 'Color', 'k')
![enter image description here](https://istack.dev59.com/0HndTm.webp)
现在PNG和EPS都能够成功地显示有色的
axes
,这意味着对角线以外的所有内容在PNG和EPS中都是功能透明的。无论只是一个
axes
还是其他绘图对象,都可以实现这一点。
现在,回到您发布的问题。不幸的是,您的图片链接已经失效,但如果您打开创建的EPS文件,很可能会看到图像位于黄绿表面下方,只是表面使用了透明度,MATLAB强制使透明区域不透明,并用白色抖动。然后,当您查看生成的EPS文件时,这个实心表面覆盖了下面的图像,使它看起来好像消失了。如果将透明表面元素的
CData
值更改为
NaN
,则可以在这些位置通过表面看到图像。
export_fig
- Ander Biguri