从 matlab 曲面图导出 svg 图像
exporting svg image from matlab surface plot
我需要一些来制作一些 publication-quality 数字。我首先以 .svg 格式从 matlab 导出图形,然后在 inkscape 中做一些 post-processing。我对使用 plot
或 scatter
生成的图形没有问题,但是当我导出使用 surf
(在 view(2)
中)生成的图形时,我 运行 遇到了问题。如果我使用 plot
或 scatter
,我可以在 inkscape 中取消分组并处理标题、轴、散点、线条等各个部分。然而,对于 surf
,matlab 仅导出一个单独的图形,其中所有不同的部分组合成一个单元。我无法分开单独的部分,当我缩放得非常近时,我实际上可以看到坐标轴和标题的位图分辨率(如果我使用 plot
,缩放时标题和坐标轴的分辨率为 'infinite'很接近)。我对具有有限分辨率的表面图很好,但我至少需要能够处理轴和标题(我目前无法做到)。我应该怎么做才能 'separate' 主图的标题和轴,就像从 plot
和 scatter
?
生成的图形一样
我过去也使用 Inkscape 来发表我的科学出版物,但我发现很多时候在 latex 中使用 pgfplots 可以获得更好的结果,连同 matlab2tikz matlabscript。网上有大量关于此的资源,但这里是我的工作流程如何适应您的冲浪情况。我有安装了 latex、matlab 和 matlab2tikz 的 macOSX。将在 linux 上几乎不做任何修改就可以工作。
在 Matlab 中:
surf(peaks(25))
matlab2tikz('plot.tikz’)
然后我有以下 bash-脚本(只是与图像位于同一文件夹中的脚本,只需双击即可执行)。 (需要 chmod-ed 作为可执行文件)。
#!/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,效果很好。这是另一个建议!
我偶然发现了这个问题,因为我遇到了同样的问题。
如@vindarmagnus 所述,可以使用 tikz 并获得相当不错的结果。但是,根据我的经验,tikz 在使用 surf 等时遇到了大数据集问题。
对我有用的解决方案:
将渲染器更改为画家,导出的 .svg 文件将在打开时保留其矢量图形属性,例如在 inkscape 中:
figure('Renderer','Painters');
您还可以使用:
set(gcf,'Renderer','Painters')
我需要一些来制作一些 publication-quality 数字。我首先以 .svg 格式从 matlab 导出图形,然后在 inkscape 中做一些 post-processing。我对使用 plot
或 scatter
生成的图形没有问题,但是当我导出使用 surf
(在 view(2)
中)生成的图形时,我 运行 遇到了问题。如果我使用 plot
或 scatter
,我可以在 inkscape 中取消分组并处理标题、轴、散点、线条等各个部分。然而,对于 surf
,matlab 仅导出一个单独的图形,其中所有不同的部分组合成一个单元。我无法分开单独的部分,当我缩放得非常近时,我实际上可以看到坐标轴和标题的位图分辨率(如果我使用 plot
,缩放时标题和坐标轴的分辨率为 'infinite'很接近)。我对具有有限分辨率的表面图很好,但我至少需要能够处理轴和标题(我目前无法做到)。我应该怎么做才能 'separate' 主图的标题和轴,就像从 plot
和 scatter
?
我过去也使用 Inkscape 来发表我的科学出版物,但我发现很多时候在 latex 中使用 pgfplots 可以获得更好的结果,连同 matlab2tikz matlabscript。网上有大量关于此的资源,但这里是我的工作流程如何适应您的冲浪情况。我有安装了 latex、matlab 和 matlab2tikz 的 macOSX。将在 linux 上几乎不做任何修改就可以工作。
在 Matlab 中:
surf(peaks(25))
matlab2tikz('plot.tikz’)
然后我有以下 bash-脚本(只是与图像位于同一文件夹中的脚本,只需双击即可执行)。 (需要 chmod-ed 作为可执行文件)。
#!/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,效果很好。这是另一个建议!
我偶然发现了这个问题,因为我遇到了同样的问题。
如@vindarmagnus 所述,可以使用 tikz 并获得相当不错的结果。但是,根据我的经验,tikz 在使用 surf 等时遇到了大数据集问题。
对我有用的解决方案:
将渲染器更改为画家,导出的 .svg 文件将在打开时保留其矢量图形属性,例如在 inkscape 中:
figure('Renderer','Painters');
您还可以使用:
set(gcf,'Renderer','Painters')