Matplotlib 系列:导出高 DPI 的图片
前言
昨天一同学问我怎么把已经画好的图片的 DPI 改到 300,以满足期刊对图片清晰度的要求。上网搜索一番后才发现,虽然我经常在 Matplotlib 中用 dpi
参数来调节图片清晰度,但实际上我对这个概念半懂不懂。这次借这个契机调研和总结一下相关的知识。本文将会依次介绍
- 分辨率和 DPI 是什么。
- DPI 和清晰度的关系。
- 如何导出期刊要求的高 DPI 图片。
昨天一同学问我怎么把已经画好的图片的 DPI 改到 300,以满足期刊对图片清晰度的要求。上网搜索一番后才发现,虽然我经常在 Matplotlib 中用 dpi
参数来调节图片清晰度,但实际上我对这个概念半懂不懂。这次借这个契机调研和总结一下相关的知识。本文将会依次介绍
之前在 Linux 上用 Python 处理系统的文件和目录时,我都是简单粗暴地用 os.system
函数直接执行 shell 命令来实现的。例如新建一个目录并把文件移动进去,我会这么写
dirpath = './result'
filepath = './data.txt'
os.system(f'mkdir {dirpath}')
os.system(f'mv {filepath} {dirpath}')
即把 shell 命令硬编码到程序中。但最近在 Windows 上运行老程序时,因为 os.system
默认调用 CMD,所以这种写法的老代码全部木大。
其实借助 Python 标准库中用于系统交互和路径处理的模块,就能尽可能降低代码对平台的依赖,并且模块中也提供有许多方便的函数。本文会记录那些最常用的功能。
Cartopy 中的 Plate Carrée 投影使用方便,但在展示中国地图时会使中国的形状显得很瘪,与之相比,Lambert 投影的效果会更加美观,下图显示了两种投影的差异
所以本文将会介绍如何在 Cartopy 中实现 Lambert 投影,并为地图添上合适的刻度。文中 Cartopy 的版本是 0.18.0。
常用的地图可视化的编程工具有 MATLAB、IDL、GrADS、GMT、NCL 等。我之前一直使用的是脚本语言 NCL,易用性不错,画地图的效果也很好。然而 2019 年初,NCAR 宣布 NCL 将停止更新,并会在日后转为 Python 的绘图包。于是我开始考虑转投 Python,同时觉得在 Python 环境下如果还是用 PyNGL 那一套语法的话,未免有些换汤不换药。因此我选择用 Python 环境下专有的 Cartopy 包来画地图。
此前 Python 最常用的地图包是 Basemap,然而它将于 2020 年被弃用,官方推荐使用 Cartopy 包作为替代。Cartopy 是英国气象局开发的地图绘图包,实现了 Basemap 的大部分功能,还可以通过 Matplotlib 的 API 实现丰富的自定义效果。
本文将会从一个 NCL 转 Python 的入门者的角度,介绍如何安装 Cartopy,如何绘制地图,并实现一些常用的效果。代码基于 0.18.0 版本的 Cartopy。
现实中观测的数据或多或少会有缺失的部分,通常称为缺测值(missing value)。NumPy 因为设计上的问题,不能像 R 和 NCL 那样原生支持缺测类型,而是有两种处理缺测的实现:NaN 和 masked array。下面便来依次介绍它们。代码基于 NumPy 1.20.1。
这里简单介绍一下立体角的概念。
在考虑辐射传输问题时,为了度量源点对某一范围的视场角大小,我们引入立体角的概念。通常教材上的定义如下图所示,一个半径为 $r$ 的球体,用顶点与球心重合的圆锥去截球面,截取的球面积 $A$ 的大小除以半径的平方,即是立体角。