Зубчатый контур с использованием Matlab 2014b
Я строю некоторые карты, используя Matlab, которые используют mapshow
построить границу страны из шейп-файла. Затем я экспортирую их в формат PDF и EPS, используя export_fig
пакет. Это работало совершенно нормально с использованием Matlab 2014a, но я только что перешел на Matlab 2014b, чтобы воспользоваться преимуществами чего-то еще, что улучшилось, и теперь граница моей страны вся зубчатая. Граница выглядит зубчатой только на сохраненных версиях файла. Если я увеличу окно рисунка, контур не будет таким.
Вот фрагменты кода, которые важны. Это пользовательский шейп-файл, поэтому я не знаю, как его здесь разместить, чтобы люди могли его воспроизвести.
Этот бит читает в шейп-файле и строит его. Тип отображения "многоугольник", если это уместно, следовательно, избавиться от 'FaceColor'
так что я могу видеть то, что я рисую внизу (зеленые биты на фоне изображений, нанесенных с помощью pcolor
).
thaiborder=shaperead('Thailandborder');
mapshow(thaiborder,'FaceColor','none');
Этот бит как я экспортирую фигуру.
export_fig test.eps -r600 -painters
export_fig test.pdf -r600 -painters
Это версия с гладкой каймой от Matlab 2014a:
Это примерно та же самая область изображения с зубчатой границей из Matlab 2014b:
Кто-нибудь знает, почему эти различия происходят? Я хочу, чтобы граница была такой, как на первом изображении, но мне нужна "улучшенная" функциональность Matlab 2014b для другой вещи в том же изображении. Что мне нужно изменить?
Изменить, чтобы добавить: я был в контакте с создателем export_fig
и он думает, что это вызвано тем, что Matlab теперь использует митровые соединения, а не круглые. Видимо, я должен написать в MathWorks, чтобы пожаловаться. Я не назвал это ответом, потому что кто-то другой может предложить мне решение.
2 ответа
Матлаб признал, что это известная ошибка. Для меня первое исправление сработало.
Проблема с зубчатыми линиями на рисунках при экспорте в векторный формат является известной ошибкой в MATLAB R2014b. Это связано с сочетанием линейных соединений и метрических ограничений, используемых в векторном формате.
Чтобы обойти эту проблему, используйте прикрепленные функции исправления для последующей обработки файла EPS. Вы можете использовать один из следующих способов вызова этой функции fixeps.
fixeps ('input.eps', 'output.eps', 'LJ')% Изменит линейное соединение на круглое
fixeps('input.eps','output.eps','ML') % Исправит митрэмит
function fixeps(inname,outname,fixmode)
if nargin==2
fixmode = 'LJ';
end
fi = fopen(inname,'r');
fo = fopen(outname,'w');
tline = fgets(fi);
while ischar(tline)
if (strcmp(tline,['10.0 ML' 10])) % Replace 10.0 miterlimit
switch (fixmode)
case 'LJ'
fwrite(fo,['1 LJ' 10]); % With round linejoin
case 'ML'
fwrite(fo,['2.5 ML' 10]); % With smaller miterlimit
end
else
fwrite(fo,tline);
end
tline = fgets(fi);
end
fclose(fo);
fclose(fi);
У меня была похожая проблема, вызванная параметром "MarkerSize". Похоже, что в версии 2014b он наследует единицы фигуры. Например, если у меня есть цифра в сантиметрах и я спрашиваю ('MarkerSize', 10), 10 будет интерпретироваться не как точки (как в 2014a), а как см. Я исправил это, изменив единицы измерения на pt.