20210425 -
0. 引言
论文中进行作图,需要对图片中的各种元素进行控制,最近在论文写作过程中为了能够得到匹配文章的高质量图片,也是花了很多心血。除了对图片中的风格进行控制,另一方面比较重要的就是控制其中各种元素的大小等信息。本篇文章将从这个角度出发,来记录一下最近看到的一些比较好的文章以及自己的一些体会。
1. 基础知识
在平时进行绘图的过程中,可能也就是控制控制图片大小,figsize=(10,8)
,然后可能再控制控制一些元素的大小,例如线宽,标题字体大小等。虽然能够达到一定的效果,但是这里存在一个比较严重的问题。在使用latex插入论文图片的时候,经常会进行图片的缩放。虽然对于图片的所呈现的具体内容可能没有太大影响,而且使用的图片类型多是pdf格式,也不会出现比例失调的情况。但是这种方式会导致图中的字体元素也同时被缩放。一旦被缩放,就会导致图片中的字体大小与论文中的大小关系不协调。例如latex插入的图片标题和图片中坐标中的字体的大小差距就很大。
那么在解决这个问题之前,先回顾一下matploblib中一些大小的概念,主要包括图片大小,DPI,PPI等,该部分内容主要参考问答[1]。
创建图像时,会指定figsize,例如figsize = (10,8)
,注意这里的单位是英寸。平时作图保存为pdf格式之后,利用pdf阅读器打开,可能默认缩放到屏幕大小,也就看不出来图片大小是不是变化,改为100%缩放之后,就能看到图片的大小。
而DPI,全称为Dots per inches,每英寸的像素点,在matplotlib中默认的DPI是100。这样往后顺推之后,为了得到某个像素大小的图片,就可以有多种组合方式,可以通过扩大图片大小来实现,也可以增大DPI来实现。
正常情况下,指定的字体或者字高(框住字体的框子的高度)来扩大大小;对于图片中的元素,matplotlib默认使用72 ppi(Points per inch)。那么如果线宽是1个点的话,在dpi为72的时候,这正好就是一个像素。这样就是一个对应的关系,而如果扩大了dpi,例如变成了144dpi,那么线宽就是两个像素。
上面这个图片就展示这个过程,分别是72和144dpi,因为这个线是斜线,所以扩大了之后显得不是严格的1个和2个像素,但是能够体现出来这个关系。
那么从这个角度来说,如果增大了图片的大小,如果没有改变这个线宽或者元素的大小,两个图片中的元素大小都是一样的。而只有改变dpi之后才会有所变化。
(虽然是这么说,但是对于如果使用pdf这种格式来说,如果进行了缩放,是看不出来上面的效果的)
2. 论文中的图片大小控制
前面的内容介绍了跟大小有关的内容,有关这部分内容,之前在进行绘图的时候,越是深入的对这部分进行调整,就越觉得不对劲,还是一开始的时候没有把这部分内容了解清楚。那么这样之后,如果要达到前面要求的目的,就是图片中的字体大小和论文字体大小一样的话,如果图片大小很大,就容易导致文字缩放后达不到要求,这个比例也不是很好控制。比较好的办法就是,将图片字体和论文中字体调整为一致大小,同时保证这个图片的大小也基本上是占据这块空间的大小。。查看了几篇文章之后,方法都差不多。其中涉及这部分操作的有文章[2][3],两个文章的方法不完全一致,但都是在测量了论文的尺寸之后来进行操作。下面分别来进行介绍。
2.1 检查论文中图片尺寸
文章[2]的方法是,插入一个自适应的图片,设置图片宽度为列宽度(双列论文)(平时插入图片的时候都是使用了\textwidth)。
\begin{figure}
\includegraphics[width=\columnwidth]{placeholder}
\caption{This is a placeholder to measure the width of a plot. Its with is set to \texttt{columnwidth}.}
\end{figure}
然后利用inkscape软件来查看这个图片所占用的大小(单位英寸)同时字体大小设置为8pt
。
这里有些不同的是,他在保存图片的时候,没有使用tight layout的相关参数,文章作者推荐使用这种方法来控制,因为可能导致图片大小并不是最终想要的;而是在最后的时候调整了图片大小。在设置图片高度的时候使用了黄金比例。
import numpy as np
import matplotlib as mpl
mpl.use('pdf')
import matplotlib.pyplot as plt
plt.rc('font', family='serif', serif='Times')
plt.rc('text', usetex=True)
plt.rc('xtick', labelsize=8)
plt.rc('ytick', labelsize=8)
plt.rc('axes', labelsize=8)
width = 3.487
height = width / 1.618
fig, ax = plt.subplots()
fig.subplots_adjust(left=.15, bottom=.16, right=.99, top=.97)
x = np.arange(0.0, 3*np.pi , 0.1)
plt.plot(x, np.sin(x))
ax.set_ylabel('Some Metric (in unit)')
ax.set_xlabel('Something (in unit)')
ax.set_xlim(0, 3*np.pi)
fig.set_size_inches(width, height)
fig.savefig('plot.pdf')
大致代码如下,其中利用subplots_adjust来调整主要图片的位置,这个部分是一定要谨慎调整到,防止某些部分被放置在图片外面。
2.2 通过论文宽度来调整
在文章[3]中,使用了另外的方法,在编译pdf文件的时候,先查看论文宽度是多少。
% your document class here
\documentclass{report}
\begin{document}
% gives the width of the current document in pts
\showthe\textwidth
\end{document}
然后通过公式来计算图片应该有的大小。但是他这里感觉更适用于单栏的环境。同时他采用了fig.savefig('example_1.pdf', format='pdf', bbox_inches='tight')
的方法,与文章[2]有所不同。
2.3 小结
个人觉得,文章[2]的方法可能更直接,因为这样得到的尺寸是完全贴合论文大小的;文章[3]是通过计算的方式,最后保存的时候使用了bbox_inches的参数,平时使用这个参数都是为了调整旁边的空白位置,暂时没有深究这个参数是否会影响整个图片的大小,从而导致自己的缩放。
在使用的时候,个人感觉可以结合两者的方法,而且应该明白自己插入的时候到底图片应该是什么样的尺寸,这个是关键的。
最后两者在插入图片的时候,都是没有压缩的,也就是没有任何参数。
\begin{figure}
\centering
\includegraphics{figure_name.pdf}
\end{figure}
相关内容
学习过程中,还遇到过一些其他的内容,这些内容是介绍如何画出比较好看的图,基本上都是如何控制各个元素,全部应该考虑的内容。
- matplotlib_for_papers
- Styling plots for publication with matplotlib
参考
[1]Relationship between dpi and figure size
[2]Publication-Quality Plots with Matplotlib
[3]Plot publication-quality figures with matplotlib and LaTeX
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)