答案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_fig
(https://github.com/altmany/export_fig) 将此图像导出为 EPS 或 PDF?