如何绘制符合打印标准的图形
论文中大部分的绘图都需要考虑打印的质量和尺寸,前面的博客中说到如何修改图片的尺寸以符合打印的质量,这里分享一下有关绘图的时候的考虑,以达到快速绘图的目的
问题是什么
在面向打印的论文制作中,一般时A4的纸张,图片均可以通过修改尺寸达到相应的尺寸要求,但是与此同时会有两个方面的问题:
- 图的分辨率会变。就是那个dpi会发生改变
- 图上的文字和标注可能变得过大或者过小
解决思路
面对这样的不确定性,需要在绘图的时候就考虑3个问题:
- 一个是图片的尺寸,也就是它的长度和宽度;
- 另一个是图片的分辨率,也就是它的dpi;
- 还有就是绘图中的文字的大小
以matplotlib绘图工具为例
1 import matplotlib.pyplot as plt 2 import matplotlib 3 matplotlib.rc('font', family='simhei') 4 5 pre = pd.DataFrame(Rain_list,columns=['time','pre']) 6 pre.index = pre['time'] 7 pre =pre.sort_index() 8 pre.columns = ['time', 'A处降雨'] 9 pre['A处降雨'].plot(fontsize = 14); 10 11 12 timeStart,timeEnd = datetime(2012,7,21,6),datetime(2012,7,23,20) 13 tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00 14 timeStart = timeStart.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00 15 timeEnd = timeEnd.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00 16 # rain_end = rain_end.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00 17 18 19 plt.axvspan(big_rain_start, big_rain_end, facecolor='0.5', alpha=0.5) 20 21 plt.axvspan(big_rain_end, rain_end, facecolor='#2ca02c', alpha=0.5); 22 23 plt.xlim(timeStart,timeEnd ); 24 plt.ylim(0,20); 25 plt.xlabel("时间",fontsize = 16) 26 plt.ylabel("降雨(mm/h)",fontsize = 16); 27 plt.legend(loc='upper right',fontsize = 16) 28 plt.tight_layout() 29 # plt.savefig("C:\\Users\\theki\\Documents\\我的坚果云\\myPHDThesis\\figs\\jiangyuliang_v2.png",dpi = 300)
上面的代码并不完善,不过它的字体的设置、图的大小,分辨率都是我在论文中的设置。字体和字体大小可以很容易的看到,但是图片大小使用的是默认的大小,dpi设置为300。
通过下面输出图片尺寸
print(plt.rcParams.get('figure.figsize'))
得到
[6.0,4.0],注意matplotlib的图片尺寸使用的是英寸,我们国家通常使用厘米,我们可以使用下面的连接转换以下,得到是【15.24,10.16cm】
https://convertlive.com/zh/u/%E8%BD%AC%E6%8D%A2/%E8%8B%B1%E5%AF%B8/%E8%87%AA/%E5%8E%98%E7%B1%B3
那这个打印出来是多大呢,我在gmip里面打开了,并打开打印(快捷键ctrl P),
我们可以看到matplotlib所得到的默认大小在设置成300dpi的时候,实际上是差不多A4纸设置双栏打印的时候,能够跨越两个兰的尺寸大小。
值得注意的是,我们在使用jupyter notebook的时候,所显示的这个图片的大小其实并没有那么大的?这是为什么呢?可能默认的dpi比较小,这样在屏幕上平铺像素的时候它就比较小;为了验证这个想法,我在没有设置dpi的时候保存了图片,然后在gmip中打开
我们发现这个图片的尺寸和前面的是一样的,但是dpi变成了72左右。为什么会这样呢,这是因为屏幕显示和打印存在一些区别。
我们设置的尺寸一定的情况下,在电脑屏幕直接查看,在不缩放的情况下,dpi越大,图片显示越大
总之在没有设置打印预览的时候无法根据实际看到它们的打印大小,其实最有效的方法有两个:
1. 一个是有一个标尺和参照告诉我们我们的尺寸是怎么样的
2. 另一个是直接设置尺寸(matplotlib使用的就是这样的方式)
使用drawio的情况
值得注意的是在使用专业绘图工具如visio或者drawio的时候是一个标尺和参照告诉来我们打印的尺寸是怎么样的的
我们可以看到这类的绘图都是会显示一个页面来告诉我们打印尺寸的标尺是什么样的,这里可以缩放这个视图。打印的那个A4纸样张底图和所绘制的图形一起缩放。
有哪些待解决的问题
1. 那matplotlib有打印预览么?如何设置?
思路可以是,保存为pdf,然后使用打印预览如图
当然也可以保存图片使用打印预览。
还有就是pdf格式相对于png来说文件小很多,但是对于word和ppt来说并不能直接支持pdf图形显示。
但是pdf对于latex书写论文来说有很多优势,因为它是矢量图形缩放不会失真,很清晰。参考下面的链接
https://ercanozturk.org/2017/12/16/python-matplotlib-plots-in-latex/
不过还有一个比较重要的问题,如何设置字体大小才比较合适呢?如何保证论文图中的字体大小比较一致?如何保证整个图的绘图图的风格一致呢?
不过回过头来想一想,图中的字体真的重要么?????!!
看了很多论文包括nature的一些论文,答案是即使是nature上的论文其字体和字体大小也不一定一致的。
此外发现越是质量比较好的,它们的图中的字体越趋向于一致,特别是在一个绘图中,或者出现在一个页面的绘图中。对于nature上的论文是一致的。自己在写论文的时候可以尽量保持一致,比如要是使用matplotlib绘制的图,所有的都应该保持一致。
打开可能是,对于一个研究和论文来说,在做实验时的时候最好先保存相关的数据然后再绘图;此外还应该再一个单独的文件里面绘制所有的图?