MATLAB: как НЕ экспортировать данные за пределы оси графика в SVG

Наверное, слишком особенный вопрос, но на всякий случай кто-то сталкивался с подобной проблемой.

Я использую plot2svg для получения графиков из Matlab в Inkscape. Работает нормально, за исключением одной довольно неприятной проблемы. Если я хочу показать только увеличенную часть кривой, plot2svg «захватывает» всю кривую, а затем обрезает ее. В результате файл SVG намного больше, чем мог бы быть, и иногда Inkscape даже дает сбой на сложных кривых.

Что могло бы помочь, так это какой-то способ удалить данные за пределами оси перед экспортом SVG. Я пробовал чистить щеткой (удалять необработанные), но затем plot2svg не работает:

Attempted to access parts(1); index out of bounds because numel(parts)=0.

Error in plot2svg>line2svg (line 2237)
    if parts(1)~=1

Error in plot2svg>axchild2svg (line 1365)
    line2svg(fid,groupax,axpos,x,y,scolorname,linestyle,linewidth)

Error in plot2svg>axes2svg (line 1042)
group = axchild2svg(fid,id,axIdString,ax,group,paperpos,axchild,axpos,groupax,projection,boundingBoxAxes);

Error in plot2svg (line 221)
    group=axes2svg(fid,id,ax(j),group,paperpos);

Кто-нибудь может предложить какое-нибудь решение? Я бы не хотел использовать экспорт в EPS или PDF в Matlab, потому что их качество намного хуже, чем у plot2svg.

Matlab 2011b 64bit, plot2svg 10 ноября 2010 г., Win 7 Pro 64.


person texnic    schedule 15.04.2012    source источник
comment
Если у вас есть аварийный документ, и это действительный SVG, вы бы отправили его команде Inkscape? Я думаю, они приветствовали бы любые возможности повысить устойчивость к нагрузкам.   -  person halfer    schedule 16.04.2012
comment
Я уже делал это некоторое время назад: bugs.launchpad.net/inkscape/+bug/888559. К сожалению, это до сих пор не исправлено. Кроме того, я использую возможность Inkscape экспортировать чертежи в формате PDF + TeX. Этот экспорт занимает много времени для больших ломаных линий.   -  person texnic    schedule 17.04.2012
comment
Ах, спасибо, хорошо, что вы сделали свое дело! :)   -  person halfer    schedule 17.04.2012


Ответы (1)


Все значения вашей кривой, которые лежат за пределами (увеличенных) осей, должны быть установлены на NaN. Matlab не будет рисовать эти точки и, следовательно, plot2svg не будет их экспортировать. Однако это требует перерисовки кривой после масштабирования.

Обязательно сохраните дескриптор вашей кривой при ее построении:

figure(1)  
h = plot(yourXdata, yourYdata);

Затем увеличьте интересующую вас область и запустите следующий код:

figure(1)
hold on  
myXlim = xlim;  
myYlim = ylim;  

% crop your data  
yourXdata(yourXdata < myXlim(1)) = NaN;  
yourXdata(yourXdata > myXlim(2)) = NaN;  

yourYdata(yourYdata < myYlim(1)) = NaN;  
yourYdata(yourYdata > myYlim(2)) = NaN;  

% delete old curve and draw the new one  
delete(h);
plot(yourXdata, yourYdata);
person H.Muster    schedule 23.04.2012
comment
Спасибо. Я считаю, что это лучший вариант, пока ошибка в plot2svg не будет исправлена. Однако одно предложение. Вышеописанный алгоритм удаляет все точки данных за пределами видимой области. Вы должны держать по одной точке снаружи в каждом направлении, чтобы кривые доходили до границ. Тем временем я сделал более или менее то же самое, что и обходной путь: поскольку мои данные отображаются в отдельной функции (это много кривых, а не одна), я просто передаю ей интересующую область, и она отображает только вещи, которые будут видны. - person texnic; 23.04.2012