【问题标题】:exporting svg image from matlab surface plot从 matlab 曲面图中导出 svg 图像
【发布时间】:2016-12-31 23:33:12
【问题描述】:
我需要一些来制作一些出版质量的数据。我首先以 .svg 格式从 matlab 导出数字,然后在 inkscape 中进行一些后期处理。我对使用plot 或scatter 生成的数字没有问题,但是当我导出使用surf(在view(2) 中)生成的数字时,我遇到了问题。如果我使用plot 或scatter,我可以在inkscape 中取消组合和处理标题、轴、散点、线条等各个部分。但是,对于surf,matlab 仅导出一个图形,其中所有不同的部分组合成一个单元。我无法分离单个部分,当我非常接近缩放时,我实际上可以看到轴和标题的位图分辨率(如果我使用plot,当我非常接近缩放时,标题和轴具有“无限”分辨率)。我对具有有限分辨率的曲面图很好,但我至少需要能够处理轴和标题(我目前不能这样做)。我应该怎么做才能将标题和轴与主图“分开”,就像从 plot 和 scatter 生成的数字一样?
【问题讨论】:
标签:
matlab
svg
plot
figure
surface
【解决方案1】:
我偶然发现了这个问题,因为我遇到了同样的问题。
正如@vindarmagnus 所提到的,使用 tikz 并获得相当不错的结果是可能的。但是,根据我的经验,tikz 在使用 surf 等时遇到了大型数据集的问题。
对我有用的解决方案:
将渲染器更改为画家,导出的 .svg 文件将在打开时保留其矢量图形属性,例如在inkscape中:
figure('Renderer','Painters');
【解决方案2】:
我以前也使用 Inkscape 来发表我的科学出版物,但我发现很多时候使用 latex 中的 pgfplots 可以获得更好的结果,同时matlab2tikz matlabscript。网上有大量关于此的资源,但这就是我的工作流程如何适应您的冲浪情况。我有安装了乳胶、matlab 和 matlab2tikz 的 macOSX。在 linux 上几乎不需要修改就可以工作。
在 Matlab 中:
surf(peaks(25))
matlab2tikz('plot.tikz’)
然后我有以下bash-script(只是与图像在同一文件夹中的一个脚本,只需双击即可执行)。 (需要作为可执行文件进行 chmod 编辑)。
#!/bin/bash
cd ~/Desktop
rm *.eps
cat > plot.tex << EOF
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{max space between ticks=50}
\pgfplotsset{scaled ticks = false}
\pgfplotsset{compat=1.6}
\pgfplotsset{xticklabel style={/pgf/number format/fixed}}
\pgfplotsset{yticklabel style={/pgf/number format/fixed}}
\begin{document}
\input{plot.tikz}
\end{document}
EOF
pdflatex plot.tex
pdf2ps plot.pdf
ps2eps plot.ps
请注意,应该更改上面的行 cd ~/Desktop 以反映脚本应该从哪个文件夹运行(有点糟糕,但需要,因为 Finder 不能正确传递执行程序中的文件夹,afaik)。
这会产生高质量的 eps 或 pdf 或您喜欢的图像,具有大量的轴和刻度等设置。而且它都使用原生乳胶字体。
编辑:
最近开始在matlab中使用patch(),然后按照上面的方法导出到tikz,效果很好。这是另一个建议!
【解决方案3】:
你也可以使用:
set(gcf,'Renderer','Painters')