MATLAB:如何在导出SVG时不将数据导出到绘图轴外部

4

可能是一个比较特殊的问题,但以防万一有人遇到类似的问题。

我正在使用plot2svg将Matlab中的图形转移到Inkscape。它运行良好,除了一个非常烦人的问题。如果我想显示曲线的缩放部分,plot2svg会“捕捉”整个曲线,然后对其进行剪裁。结果,SVG文件比它本来应该的更大,并且有时在处理复杂曲线时甚至会导致Inkscape崩溃。

有什么办法可以在导出SVG之前删除轴外的数据?我尝试过brushing(删除未刷选的部分),但这样做会导致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);

有人能提供任何解决方案吗?我想避免使用Matlab中的EPS或PDF导出,因为它们的质量比plot2svg差得多。

Matlab 2011b 64位,plot2svg 10-Nov-2010,Win 7 Pro 64位。


如果您有一个容易崩溃的文件,并且它是有效的SVG格式,您会提交给Inkscape团队吗?我认为他们会欢迎任何机会来提高其加载韧性。 - halfer
我已经在一段时间前完成了它:https://bugs.launchpad.net/inkscape/+bug/888559。不幸的是,它仍然没有被修复。此外,我正在使用Inkscape将绘图导出为PDF+TeX的能力。对于大型折线,这种导出需要很长时间。 - texnic
啊,谢谢,你已经完成了你的部分!:) - halfer
1个回答

0

所有曲线上的值,如果在(缩放后)坐标轴之外,则应设置为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);

谢谢。我相信这是最好的选择,直到plot2svg中的错误被纠正。然而,有一个建议。上述描述的算法会删除所有在可见区域之外的数据点。你应该在每个方向上保留一个点,以使曲线达到边界。与此同时,我已经做了更多或更少相同的事情作为解决方法:由于我的数据是在一个单独的函数中绘制的(不仅仅是一个),我只需将感兴趣的区域传递给它,它就只绘制可见的东西。 - texnic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接