Я знаю, что это поздний ответ на этот вопрос, но я решил, что дам объяснение того, что происходит, на случай, если у кого-то возникнет эта проблема в будущем.
Основная проблема здесь заключается в том, что файлы 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 фактически заменил сплошной красный цвет для этих областей. Проще говоря, в областях, которые полностью белые в 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
, вы сможете видеть изображение сквозь поверхность в этих местах.
person
Suever
schedule
05.06.2016
export_fig
- person Ander Biguri   schedule 16.11.2015