炸鸡人博客 基本上无害

我所整理的各种炸鸡资源

此内容受密码保护。如需查阅,请在下列字段中输入您的密码。

Matplotlib 系列:网格数据与 pcolor

前言

Matplotlib 的 pcolor 函数能够绘制由一个个四边形(quadrilateral)单元构成的网格数据的彩色图像,相比绘制等值填色图的 contourf 函数,不会产生过度的平滑效果,能忠实反映像元的数值大小,因而在科学可视化中也很常用。本文并不打算介绍该函数的种种,只想着重讨论网格数据的显示效果、shading 参数发挥的作用,以及 pcolorpcolormesh 这对双胞胎间的差异。本文基于 Matplotlib 3.3.4。

图解网格数据

pcolor 全名 pseudo color,即伪彩色。函数签名为

pcolor([X, Y], C, **kw)

其中 XY 分别是网格的横纵坐标,C 是网格单元内变量的数值。之所以称之为“伪”,是因为 pcolor 并不像 imshow 那样直接用 RGB(A) 数组表示颜色,而是将 C 的数值归一化之后,在一个颜色查找表中查找对应的颜色,进而用颜色差异表现数值大小(原理详见 Matplotlib 系列:colormap 的设置)。C 数组的形状为 (ny, nx)XY 的形状要比 C 大上一圈,即 (ny + 1, nx + 1)ny 在前表示纵坐标会随数组的行号变动,nx 在后表示横坐标会随数组的列号变动。pcolor 对网格数据的显示效果如下图所示

regular_and_irregular_grids

Python 系列:变量命名时形容词应该放在名词前面还是后面?

今天改程序时脑海里突然蹦出这个问题,更宽泛地说,是修饰词或者偏正结构的先后顺序,例如

  • upper_axbottom_axax_upperax_bottom
  • start_dateend_datedate_startdate_end

一旦开始疑惑,焦虑便随之而来:哪一种比较好呢?我之前的代码里好像两种写法都出现过,有没有什么现成的规范可以参考呢?越想越不痛快,所以赶紧上网找点前人经验来背书。意外的是,网上大部分文章都在讨论如何取有意义的变量名,而关于这个问题的寥寥无几,也许是因为太细节、太“语法”了?现归纳两篇我看过的帖子以供参考。

首先在 stack overflow 上找到了一模一样的提问:是用 left_buttonright_button,还是 button_leftbutton_right 更好呢?提问者自己觉得前者符合英文语序,读起来更加自然,而后者强调了变量的重点在于按钮,而左和右是额外的补充信息。有评论指出后者在 IDE 里更方便,因为你一键入 button,就会自动联想出所有带后缀的版本。这也挺符合人的联想过程,我们肯定是先想到“我要找按钮”,再明确具体要什么样的按钮。当然也有评论给出了经典的废话:与其纠结哪一种约定,任选一种并在项目里维持一致性最重要!好家伙,要是我如此豁达还会来搜这种鸡毛蒜皮的问题吗?

Python 系列:将列表等分为 n 份

本文研究一个小问题:如何将长度为 N 的列表等分为 n 份?该问题的示意图如下

diagram1

N 除以 n 的商为 size,余数为 rest,数值满足 0 <= rest < n or size(除法规则请见 Python 系列:除法运算符)。当 Nn 的倍数时,rest = 0 ,列表正好被等分为 n 份,每份含 size 个元素;而当 N 不是 n 的倍数时,rest > 0,按前面的分法会剩下 rest 个元素。对于后一种情况来说并不存在真正的等分,只能说希望尽量等分,问题的重点也落在了如何处理这 rest 个元素上。

Matplotlib 系列:图解 quiver

前言

Matplotlib 中用箭头表示风场或电磁场等矢量场时需要用到 quiver 方法,据字典,quiver 一词的意思是颤动、颤抖或箭袋,貌似也就最后一个意思跟箭头搭得上边。相比于其它画图方法,quiver 的参数又多又容易混淆,所以本文将以图解的方式逐一介绍。这些参数按功能可分为三种:控制箭头位置和数值的、控制箭头长度和角度的,以及控制箭头尺寸和形状的。下面会按照这个分组顺序来解说。本文代码基于 Matplotlib 3.3.4。

MODIS 二级气溶胶产品指北(with Python)

前言

笔者初次使用 MODIS 二级气溶胶产品时,一下就被密密麻麻一堆变量搞懵了:很多变量名字里带个 Optical_Depth,这我能猜到,就是气溶胶光学厚度,但各种 CorrectedEffectiveBestAverageSmallLarge 的前后缀鬼知道是什么。看过的论文基本不说具体用的哪个变量,各种教程也不会告诉你这些亲戚间的差异,似乎这件事一点也不重要。本着 know your data 的心态,我在翻阅了 MODIS 的几个官网后总算从反演的原理中稍微体会到了这些前后缀的意义。现将学习经验总结归纳如下,希望能帮到和我一样疑惑的小伙伴。同时本文还会提供简单的 Python 示例代码。

如果嫌正文太啰嗦,可以直接跳到文末的总结部分,那里直接给出了各个变量的使用建议。

Matplotlib 中的 Artist——你在浪费时间瞎百度之前应该知道的东西

这是 @skotaro 在 2018 年发布的一篇关于 Matplotlib Artist 的通俗易懂的介绍,很适合作为官方教程的前置读物,故翻译于此,原文标题是 “Artist” in Matplotlib - something I wanted to know before spending tremendous hours on googling how-tos.。文中绝大部分链接都重定向到了最新版本的 Matplotlib 文档,还请读者注意。

fig_0

毫无疑问 Python 里的 matplotlib 是个非常棒的可视化工具,但在 matplotlib 中慢慢调细节也是件很烦人的事。你很容易浪费好几个小时去找修改图里细节的方法,有时你连那个细节的名字也不知道的话,搜索起来会更加困难。就算你在 Stack Overflow 上找到了相关的提示,也可能再花几个小时根据需求来修改它。不过,只要了解了 matplotlib 图的具体组成,以及你可以对组件执行的操作,就能避开这些徒劳无益的工作。我想,我跟你们中的大多数人一样,做图时遇到的困难都是靠读 Stack Overflow 上那些 matplotlib 高手们的答案来解决的。最近我发现 官方的 Artist 对象教程 信息很丰富,有助于我们理解 matplotlib 的画图过程并节省调图时间1。本文里我会分享一些关于 matplotlib 里 Artist 对象的基本知识,以避免浪费数小时调图的情况出现。

Python 系列:小心默认的可变参数

之前我在 Cartopy 系列:从入门到放弃 一文中定义了这样一个函数

def set_map_extent_and_ticks(
    ax, extent, xticks, yticks, nx=0, ny=0,
    xformatter=LongitudeFormatter(),
    yformatter=LatitudeFormatter()
):
    ...

Cartopy 系列:对入门教程的补充

前言

几年前曾写过 Cartopy 系列:从入门到放弃,但现在来看还是遗漏了不少细节,比如初学者可能会遇到以下问题

  • 经度是用 [-180°, 180°] 还是 [0°, 360°] 范围?
  • 为什么有时候设置的刻度显示不全?
  • 怎么截取跨越地图边界的区域,画图又怎么跨越边界?

本文将会用坐标变换的思想来解答以上问题,希望能给读者一些实用的启示。本来应该把这些内容写到入门教程里的,但可能会太长,所以现在单独成篇。文中的讨论主要针对最常用的 Plate Carrée 投影,其它投影需要读者自己测试。代码基于 Cartopy 0.18.0,虽然现在已经更新到 0.20.0 了,但基本思想是一致的。

Python 系列:命名空间和作用域

定义

命名空间

命名空间(namespace):官方说法是从名称到对象的映射,实际上就是保存变量名与变量值绑定关系的一个空间。赋值语句会将绑定关系写入命名空间,而引用变量时则会根据变量名在命名空间中查询出对应的值。并且大部分的命名空间都是利用 Python 的字典来实现的(例外如类的 __slots__ 属性)。程序中出现在全局的变量构成一个命名空间,Python 内置的函数和异常类也有它们自己的命名空间,每次定义函数或类时也会创建专属于它们的命名空间。命名空间之间相互独立,同名的变量可以存在于不同的命名空间中,例如两个函数内部可以使用同名的局部变量,这有助于我们在不引发冲突的同时合理复用变量名。

作用域

作用域(scope):官方说法是 Python 程序中能直接访问一个命名空间的文本区域。听起来有点抽象,实际上就是指出程序中哪些区域的文本归哪个命名空间管理,例如函数的作用域显然就是函数体(定义函数的所有语句),全局作用域就是从头到尾整个程序。但并不是说出现在一个作用域中的变量就一定属于该作用域(的命名空间):若在该区域内通过赋值语句等操作创建(或修改)了该变量的绑定关系后,那它就属于该作用域;否则它就属于其它作用域,在当前区域引用它需要根据特定的规则向其它作用域进行查询。例如常见的在函数中引用全局变量。本文的一个重点就是要来仔细说说这一规则。