将 cmap 与 Cartopy 一起用于日期轮廓

Using cmap for date contours with Cartopy

我有一系列 tif 海冰数据(见其中 3 个 here),我想在海冰浓度恒定值为 50% 的地方绘制等高线(见附图)。

.

每条红色虚线代表上述 1979 年至 2020 年之间每年 4 月的 50% 值。我想使用颜色图或类似的东西代替所有颜色相同的颜色,其中每条线由一种不同的颜色,这又与它所属的年份有关。最终,使用颜色条,reader 可以识别这些线条多年来的变化情况。您可以找到此图的代码 here.

建议?

提前致谢。

首先,您需要从数据集中提取时间数组。为了这个例子,我们假设它们的类型是 datetime.

# necessary imports
from datetime import datetime
import matplotlib.colors as mcol
import matplotlib.cm as mcm
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import numpy as np


# some random dates
dts = [
    datetime(1991, 5, 6, 0, 0, 0),
    datetime(2000, 1, 1, 0, 0, 0),
    datetime(2015, 1, 15, 12, 34, 56),
    datetime(2020, 12, 3, 4, 5, 6),
]

然后您应该将它们转换为数字:

num_dt = [mdates.date2num(dt) for dt in dts]

如果您的数据集的日期是“纯”数字,您可以跳过这一步,直接将它们分配给 num_dt:

num_dt = ds.time.values  # or something like that

然后您应该使用您选择的颜色图创建一个 Normalize 对象:

cmap = mcm.get_cmap("viridis")
cnorm = mcol.Normalize(num_dt[0], num_dt[-1])

接下来,使用上面的颜色图和规范化创建 ScalarMappable

sm = mcm.ScalarMappable(norm=cnorm, cmap=cmap)

最后,当您遍历数据的时间片时,使用给定的时间戳来定义颜色:

for time_stamp in my_times:
    num_time = mdates.date2num(time_stamp)  # or use the numeric value straight away, if time_stamp is a number
    color = sm.to_rgba(num_time)
    plt.contour(data_slice, colors=[color])

希望这对您有所帮助。