matlab绘制尺寸和字体合适的图片插入到latex的方法

字体和图片大小独立控制

用matllab绘制的图片,我们常常保存成pdf文件,如果要插入到latex中能够清晰的展现出来,需要控制图片大小和字体大小。需要明白一个概念,图片的大小和字体的大小是分开控制的,比如你生成一个3in*2in的图片,其中in代表英寸,图中的字体设置为10pt,那么最后的图片如果不经缩放就显示的话就是10pt,如果你生成了一个4in*3in的图片,字体还是10pt,显示的时候进行了缩放,那么字体就会跟着缩放比例变小。

matlab默认图片大小

当我们采用figure和plot命令绘制图片时,如下面代码所示:

复制代码
figure; %对源信号进行绘制
plot(rangeInd,real(targetEchoPRT));axis tight; 
xlabel('距离(m)');ylabel('幅度');

最终显示的图片如下:

它默认的字体是helvetica,是一种无衬线字体,如果需要新罗马字体,需要重写修改,而且字号默认的是10pt,约等于5号字(10.5pt)。

这里我们不做任何控制,我用matlan2020b版本,通过如下命令:

复制代码
 get(gcf, 'PaperSize')    % 输出 [8, 6](英寸)
get(gcf, 'PaperPosition')% 输出 [0, 0, 8, 6]

ans =

   21.0000   29.7000


ans =

    3.0917    9.2937   14.8167   11.1125

可知,matlab输出的图片是经过适当缩放的:

PaperSize = 21.0000, 29.7000:这表示当前 PaperUnits 是厘米 (cm),纸张大小为标准的 A4 (21cm × 29.7cm)。

PaperPosition = 3.0917, 9.2937, 14.8167, 11.1125:同样是厘米。这个位置是 MATLAB 自动计算的结果,目的是让您的绘图内容在 A4 页面上居中并适当缩放,自动计算一个合适的区域,使得图形填满页面但不溢出,并保持宽高比。

像上面的结果:

页面物理尺寸:固定 A4 (21 cm × 29.7 cm)

图形实际区域:约 14.8 cm × 11.1 cm

也就是说,物理尺寸A4纸宽21cm,这个图是14.8cm,纸张高29.7,图的宽度是11.1,大概理解就是图片位于pdf文件中央位置,宽度占页面的一半多一点点。就先下面所示:

matlab绘制图片插入到latex中

我们理工科专业由于涉及到的公式多,为了排版方便,写论文的时候需要用latex编译,如果要插入到latex中显示清晰图片那就需要将matlab绘制的图片保存为pdf文件,首先用plot绘制好图片后,再点击"文件"------>"另存为",选择pdf格式即可。

matlab默认尺寸和字体带来的问题

我们在写论文的时候,图片一般不会占一栏宽度,因为空间资源有限,篇幅很宝贵,论文一般是双栏排版,图片一般占半栏或者1/4栏,如下所示,可以看到,这个图片占了半栏,图片挺清晰的,但是图中的标签和图例的字号却超过了正文字体,正文一般是10pt的情况下,图片中的字体可以采用8pt或9pt,不可超过正文字体,不然会有一种喧宾夺主的感觉。

再看下图,这是同一篇论文,可以看到,一栏放置了3个图片,每个图片都比较小,坐标轴的字号就要比正文小,视觉上看着略微偏小。

同一篇论文中出现的图片有的大有的小,而且字号也不同,非常不协调,出现这种问题,是因为作者不明白图片的大小和字号可以分开控制,其次,他没有控制图片的输出大小,每次用matlab绘制后都是默认的尺寸,当需要占半栏的时候,就放大图片,需要占1/3栏的时候就缩写图片,这个时候图片中的字体当然也跟着变了。

同样,我们再看下一篇文章,他同样存在这个问题,图8-10中的字体很清晰,但是图11因为每个子图只占四分之一栏,导致他的字体太小。这也是因为,他画的每个图其实原始尺寸是一样大,只不过为了适应画面,有的就变小了,有的就放大了。除此之外,它还有另外一个问题,那就是宽高比不协调,图8太高了,高度超过了宽度,显得有点笨拙,不美观。

解决办法

1. 预设图片尺寸

为了解决上面的问题,我们就要在绘图的时候提前设置号尺寸,就像下面这样,我在matlab中就设置了画面的宽度和高度,其中宽度很重要,你可以先去查一下要投稿的论文的页面宽度,比如IEEE Trans的双栏排版时,半栏的宽度可能就是3.375in,那么你想让图片刚好占半栏,那就设置3in左右,不可太大和太小,那么放置图片的时候就不需要缩放或者放大了,就可以原原本本的放进来,是多大就显示多大。

复制代码
figure;
width_inch = 3;     % 半栏宽度
height_inch = 2.2;  %  高度 

上面这个例子是半栏的宽度,如果你像让图片占1/3或1/4栏,那就根据具体尺寸计算即可。

2. 宽高比的设置

选择 1.618:1 的宽高比(即宽度是高度的约1.618倍)通常能得到视觉上最和谐的图表,这个比例的图表嵌入单栏后,看起来会很优雅。

当然宽高比的核心是服务于数据,首要目的是让数据的特征清晰呈现。

  • 宽而平坦的图表:例如展示长时间平稳变化的数据,适用较扁的比例(如 2:1 或 3:1)。
  • 高大而陡峭的图表:当数据在Y轴方向变化剧烈,而X轴跨度较小,需要一个接近正方形的比例(如 1:1 或 1.2:1)。
  • 时域波形图,推荐比例1.2:1~1.5:1,略微压扁,能展现整体趋势,同时保留瞬态细节。
  • 时频图 (Spectrogram),推荐比例1.1:1~1.2:1,为了清晰展现二维的能量分布模式,接近正方形的比例能让特征更直观。
  • 不同信噪比(SNR)下的性能变化曲线图,宽高比:1.5 : 1 至 2 : 1,如果纵轴变化缓慢,可以1.5:1,让曲线舒展,如果纵轴变化极其剧烈,用2:1,可适当灵活变化。

3. 字号设置

如果我们设置好了图的大小,显示的时候就不需要缩放了,那么你设置字号是多大,最终在论文中呈现的字号就是多大,尽管有的图大有的图小,那么最终也能让它们的字号一样大,且全文统一,这样看起来很规范,很严谨。一般来说图中的字号要小于正文的字号,比如学位论文中的正文字号是12pt,那么就可以设置10pt,如果是小论文的10pt,那就可以设置8、9pt。这样看起来,图片是正文的辅佐和补充,而不会喧宾夺主。

4. 字体设置

如果没有特殊情况,图中的字体可以使用无衬线字体,比如

  • Helvetica:中性、经典的无衬线字体,但在Win系统中不预装;
  • Arial:设计上与Helvetica相似,是Windows系统的默认字体,因其极高的普及率成为图表中非常安全的选择;
  • Calibri:微软Office的默认字体,现代感强,应用也很广泛;

当然也可以为了严谨统一使用新罗马字体,那么可以采用下面的代码,一次性修改全局字体:

复制代码
set(groot, 'defaultAxesFontName', 'Times New Roman');   %一次性全局设定字体,在某些特殊情况下比如对label的中文字体设置的时候再单独设定
set(groot, 'defaultTextFontName', 'Times New Roman');
set(groot, 'defaultLegendFontName', 'Times New Roman');

5. 如何导出图片

对于老版本的matlb,比如2020之前的版本,只能先保存成pdf文件,然后再用pdf编辑器裁剪页面,将空白裁剪掉,那么这就有个问题,手一抖可能就导致裁的不够干净,而且多个子图绘图的时候,裁剪出来可能每个图都不一样大,那最终插入到论文中,就没法对齐,所以最好就安装一个新版本的matlab,它有自动裁切并保存为pdf文件的命令:

复制代码
exportgraphics(gcf, 'xxx.pdf', 'ContentType', 'vector');

其中"xxx.pdf"就是要保存的文件名,这个时候它就会在当前目录下保存为这个文件,然而将它直接拷入到latex图片目录下即可,非常方便。

6. 是否添加legend

是否需要legend,要看你这个图想要表达的意思,是否需要表格线来辅助我们做对比,比如波形图,我们想看的是线条的形状,那就不需要。但是如果是不同曲线的对比图,那我们就需要用这些标尺线来辅佐我们读图。

相关推荐
yijianace1 小时前
Polymarket 交易机器人踩坑实录
开发语言·python
-Thinker1 小时前
【无标题】
java·开发语言·算法·图搜索
future_li1 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
王五周八1 小时前
Tesseract OCR的Java使用(附安装包,非常详细)
java·开发语言·ocr
一直奔跑在路上1 小时前
深入浅出RDMA:原理、应用与实战指南
开发语言·php
杊页2 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at2 小时前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
j7~2 小时前
【C++】STL--string类--拆析解剖string类的实现以及string类的底层详解(2)
开发语言·c++·浅拷贝·深拷贝·string类的实现·string拷贝构造·string赋值重载
程序员二叉2 小时前
【JUC】AQS底层深度拆解|独占/共享模式|队列原理全详解
java·开发语言·面试·juc