matlab2tikz 频谱图太大

matlab2tikz 频谱图太大

我在 MATLAB 中生成了以下频谱图,并尝试在使用后将其导入 LaTeX 文档matlab2tikz。我完全了解排版的最大内存等问题,以及如何通过使用 LuaLaTeX 解决这些问题,以及如何通过使用 externalise 加快速度。问题是,由于我想要绘制的频谱图非常详细,它太大了,甚至无法matlab2tikz处理,当我尝试将频谱图保存为 tikz 文件时,我收到了许多错误。频谱图的底层矩阵是 20001x90 复数双精度。

您能想到什么方法将如此高细节的频谱图导入 LaTeX 文档中,而无需明显地导出为 EPS - 我真的不想这样做,因为它看起来太糟糕了!

我的频谱图

答案1

pgfplots有一个graphics绘图类型可以处理这种情况。我们可以将裸图(没有轴、标签或任何东西)导出为矢量格式,然后pgfplots在其上放置一个轴。

这样,就不会损失质量(我们使用了从 MATLAB 导出的矢量),我们可以访问所有的pgfplots功能,但是我们已经将繁重的计算/内存使用从 TeX 转移到了 MATLAB。

我没有信号处理工具箱,但这种通用方法应该适用于该工具箱生成的 MATLAB 图形。

这是 MATLAB 代码。第一部分生成一个随机的 3D 图形,我们可以用它来完成本答案的其余部分。第二部分删除了我们不想导出的所有内容(轴线、标签等)。第三部分输出矢量文件。MATLAB 确实提供了一个dpdf输出选项,但它输出的是带有边距且没有 CropBox/TrimBox 信息的全页 PDF。因此,输出为 EPS(裁剪)并在外部转换为 PDF 更容易(在这里,我从 MATLAB 内部调用 ImageMagick 命令行工具进行转换)。MATLAB 代码的最后一部分是可选的:我只是用它来快速提取和打印所有轴/颜色条限制。当我们到达时,这些将立即需要pgfplots

% These steps are needed for my example; replace with your actual spectrogram.
peaks;        % make a random 3d plot
view(0,90);   % adjust view to match spectrogram
colormap jet; % set colormap (match this in pgfplots)
title('');    % clear title

% Clean plot of any labels/annotations/text
colorbar off; % turn off colorbar (does nothing in this example)
shading flat; % remove any grid (might not be needed)
axis off;     % turn off axes

% Output file
fname = '___mydemo';  % base name; choose anything you like
print('-depsc2',fname); % print to eps (can't go direct to pdf without trimming)
system(['convert ' fname '.eps ' fname '.pdf']); % convert to pdf (ImageMagick)

% Print min/max values for use in pgfplots
ax = gca;
fprintf('xmin: %6.3f\nxmax: %6.3f\n',ax.XLim); % x limits
fprintf('ymin: %6.3f\nymax: %6.3f\n',ax.YLim); % y limits
fprintf('zmin: %6.3f\nzmax: %6.3f\n',ax.CLim); % colorbar limits

在 LaTeX 中,我创建了一种mlspectrogram样式,如果您要绘制大量此类图,这种样式可能有助于保持一致的设置。我还在siunitx轴标签中使用了单位。

然后我们可以在轴\addplot graphics {fname};内使用mlspectrogram。后面的选项集\addplot用于指定颜色条的界限,后面的选项集graphics用于指定正在绘制的文件的轴界限。

\documentclass{standalone}
\usepackage{pgfplots,siunitx}
\usepgfplotslibrary{units}
\pgfplotsset{
  compat=1.13,
  unit markings=parenthesis,
  unit code/.code 2 args={\si{#1#2}},
  mlspectrogram/.style={
    enlargelimits=false, axis on top, use units,
    xlabel=Time, x unit=\second,
    ylabel=Frequency, y unit=\kilo\hertz,
    colormap/jet, colorbar,
    colorbar style={ylabel=Power/Frequency, y unit=\decibel\per\hertz},
  },
}
\sisetup{per-mode=symbol}

\begin{document}
\begin{tikzpicture}
\begin{axis}[mlspectrogram]
\addplot % min and max values on following 2 lines are lifted from MATLAB output
  [point meta min=-6.5466,point meta max=8.0752] 
  graphics[xmin=-3,xmax=3,ymin=-3,ymax=3] {___mydemo};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

我没有足够的声誉来发表评论。你试过吗export_fighttps://github.com/altmany/export_fig) 将此图像导出为 EPS 或 PDF?

相关内容