跟着顶级科研报告IPCC学绘图:温度折线/柱图/条带/双y轴

复现IPCC气候变化过程图

引言

升温条带Warming stripes(有时称为气候条带,目前尚无合适且统一的中文释义)是数据可视化图形,使用一系列按时间顺序排列的彩色条纹来视觉化描绘长期温度趋势。

图片

 

在IPCC报告中经常使用这一方案

图片

IPCC是科研报告,同时也是向大众传播信息的媒介,变暖条纹体现了一种“极简主义” ,设想仅使用颜色来避免技术干扰,向非科学家直观地传达全球变暖趋势,非常值得我们学习。

升温条带为何显著?

近年来,极端天气事件越发频繁,而是成为一种常态。2022 年,暴雨季风引发了各地区的洪水事件[1]。另一方面,各个区域经历了几十年来最严重的热浪[2],干旱加剧,影响了中国广大地区的粮食生产、工业和基础设施。在欧洲一些国家,炎热的夏季已经变得越来越多,热浪席卷各处,而十年前情况并非如此。

2020 年,全球气温比工业化前水平高出1.2 °C (IPCC)。到本世纪末(2100 年),气温上升预计将达到约 100%。乐观情景下比工业化前水平高出1.8 ° C,当前政策下比工业化前水平高出2.7 ° C(IPCC)。

科学家们一致认为,到 2100 年,全球气温上升需要限制在比工业化前水平高1.5 °C的范围内,以防止气候系统发生不可逆转的变化(IPCC)。

数据和方法

本文通过 NASA过去 142 年的历史全球温度异常和NOAA的过去几十年二氧化碳全球浓度数据,基于 Python 中的 matplotlib 和 seaborn 包可视化数据。

代码

从 1880 年开始记录以来,全球年平均地表气温变化数据可从 NASA GISS 网站获取:https://data.giss.nasa.gov/gistemp/graphs_v4/

同时文末也提供了本文的数据和代码。

import pandas as pd
df = pd.read_csv('data/graph.csv')
#https://data.giss.nasa.gov/gistemp/graphs_v4/

图片

 

为了可视化的一致性,自定义了 matplotlib 的默认设置。

import matplotlib.pyplot as plt
#figure size and font size
plt.rcParams["figure.figsize"] = (10, 6)
plt.rcParams["font.size"] = 14#grid lines
plt.rcParams["axes.grid"] = True
plt.rcParams["axes.grid.axis"] = "y"#Setting up axes
plt.rcParams['axes.spines.bottom'] = True
plt.rcParams['axes.spines.left'] = False
plt.rcParams['axes.spines.right'] = False
plt.rcParams['axes.spines.top'] = False
plt.rcParams['axes.linewidth'] = 0.5#Ticks
plt.rcParams['ytick.major.width'] = 0
plt.rcParams['ytick.major.size'] = 0

首先进行一个简单的绘制。

import numpy as np
fig, ax = plt.subplots()
df["Annual Mean"].plot(ax = ax, c = "black", marker = "s")
df["Lowess Smoothing"].plot(ax = ax, c = "red")x = df.index.tolist()
y = df["Annual Mean"].tolist()# Define the 95% confidence interval
ci = np.mean(y) + 1.96 * np.std(y) / np.sqrt(len(y))
plt.fill_between(x, y-ci, y+ci,color = "gray",alpha = 0.25,label = "LSAT+SST Uncertainty")ax.axhline(y = 0, linestyle = "--", color = "black")
plt.legend(loc = "upper left")
plt.ylabel("Temperature anomaly w.r.t. 1951-80 mean (°C)")
plt.title("Global surface air temperature change estimates based on land and ocean data")
plt.show()

图片

黑线表示全球年平均地表气温相对于 1951-1980 年平均值的变化。红线是五年最低平滑线。

温度异常数据存在不确定性,这些不确定性源于测量、台站记录和土地覆盖变化导致的系统偏差。灰色阴影区域代表 95% 置信区间

本图也类似于IPCC的一贯表达方式。

本图也类似于IPCC的一贯表达方式。

图片

接下来绘制一个简单的条形图。

df["Annual Mean"].plot(kind = "bar")
years = np.arange(1880, 2022, 20)
plt.xticks(ticks = np.arange(0, 142, 20), labels = years)
plt.title("Global Surface Temperature relative to 1950 to 1980 Mean")
plt.ylabel("Temperature Anomaly (°C)")
plt.show()

图片

现在的条形图很单调,我们想添加温度的映射,首先查看色卡:

my_cmap = plt.get_cmap("coolwarm")
my_cmap

图片

 

映射色卡,这一步功能用seaborn则很方便:(只需要一行代码)

import seaborn as sns
sns.barplot(x = df.index, y = df["Annual Mean"],palette = "coolwarm")
years = np.arange(1880, 2022, 20)
plt.xticks(ticks = np.arange(0, 142, 20), labels = years)
plt.title("Global Surface Temperature relative to 1950 to 1980 Mean")
plt.ylabel("Temperature Anomaly (°C)")
plt.show()

图片

如果使用matplotlib,相对麻烦,思路是用 lambda 匿名函数将温度缩放在 0 1之间。所选颜色图 (coolwarm)my_cmap包含 255 种组合,其中my_cmap([0])指的是蓝色,my_cmap([1])指的是红色。其次,缩放值为每个条纹选择这些颜色y

x = df['Year'].tolist()
y = df["Annual Mean"].values.tolist()
#rescale y between 0 (min) and 1 (max)
rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))
plt.bar(x, y, color = my_cmap(rescale(y)), width = 0.8)
years = np.arange(1880, 2022, 20)
plt.xticks(ticks = years, labels = years)
plt.title("Global surface temperature relative to 1951-1980 Mean")
plt.ylabel("Temperature Anomaly (°C)"); plt.xlabel("Year")
plt.show()

图片

两张可视化是一致的,接下来想创建升温条带,这里使用PatchCollection功能,这个函数让我们能自定义各种图案。

首先将年平均气温异常读取为 pandas anomaly。然后用PatchCollection为 1880 年至 2021 年间的每一年创建了统一的条纹。数据anomaly相当于 PatchCollection col

from matplotlib.collections import PatchCollection
from matplotlib.patches import Rectangle
#matplotlib.patches.Rectangleanomaly = df["Annual Mean"]fig = plt.figure(figsize = (10, 1.5))
ax = fig.add_axes([0, 0, 1, 1])#turn the x and y-axis off
ax.set_axis_off()#create a collection with a rectangle for each year
col = PatchCollection([Rectangle((y, -1),  #xy1,       #width2        #height) for y in np.arange(1880, 2022)])#use the anomaly data for colormap
col.set_array(anomaly)#apply the colormap colors
cmap = plt.get_cmap("coolwarm")
col.set_cmap(cmap)ax.add_collection(col)#average global temperature lineax.axhline(0, linestyle = "--", color = "white")
df.plot(ax = ax, linestyle = "-", color = "black", legend = False)
#add title and text
ax.set_title("Warming Stripes (1880-2021)", loc = "center", y = 0.75)
ax.text(x = 1880, y = -1, s = "1880")
ax.text(x = 2022, y = -1, s = "2021")ax.set_ylim(-1, 2)
ax.set_xlim(1870, 2030)

图片

全球温度变暖有多方面原因,CO2温室气体是一个主要的原因:截至 2016 年,二氧化碳 (CO2) 占全球温室气体排放量的四分之三,其次是甲烷 (CH₄,17%)、一氧化二氮 (N2O,6%) ,可参考相关报告。

import matplotlib.pyplot as plt
gases = ["CO$_2$", "CH$_4$", "N$_2$O", "F-gases"]
warming_potential = [1, 25, 300, 1000]
text_height = [i*1.2 for i in warming_potential]
text = ["1", "25", "300", "1000+"] 
volume = [74.4, 17.3, 6.2, 2.1]
colors = ["brown", "darkslategray", "darkgray", "purple"]fig, (ax1, ax2) = plt.subplots(1, 2)ax1.bar(gases, warming_potential, color = colors)
for i, height, word in zip(range(4), text_height, text):ax1.text(x = i * 0.9, y = height, s = word)
ax1.set_yscale("log")
ax1.set_title("Global warming potential (GWP)\n by gas over 100-year timescale", y = 1)
ax1.spines.top.set_visible(False)
ax1.spines.right.set_visible(False)autopct = lambda p:f'{p:.1f}%'
ax2.pie(x = volume, radius = 1, startangle = 90, labels = gases,autopct = autopct, pctdistance = 0.8, colors = colors, textprops = {"color":"white"})
ax2.legend(labels = gases, bbox_to_anchor = (0.9, 0.8), ncol = 1)
ax2.set_title("Atmospheric composition of global \nGHG emissions", y = 1.1)plt.tight_layout()
plt.show()

图片

最后将二氧化碳与温度结合在一个图里,创建双y轴图像,来完成本文的收尾~

co2_annual = pd.read_csv('data/co2_annmean_mlo.csv')
# https://gml.noaa.gov/ccgg/trends/global.html#global
rescale = lambda y: (y - np.min(y)) / (np.max(y) - np.min(y))fig, ax1 = plt.subplots()
df_temp = df[df['Year'] >= 1959]
x = df_temp['Year'].tolist()
y = df_temp["mean"].values.tolist()ax1.bar(x, y, color = my_cmap(rescale(y)), width = 0.8)
ax1.set_ylabel("Temperature anomaly \n relative to 1951-80 mean (°C)", color = "red")
ax1.tick_params(axis='y', color='red', labelcolor='red')
ax1.grid(False)#Add twin axes
ax2 = ax1.twinx()
ax2.plot(x, co2_annual['mean'], color = "black", marker = "o", markersize = 4)
ax2.set_ylabel("CO$_2$ (ppm)")
ax2.grid(False)ax2.tick_params(axis='y')for pos in ["top"]:ax1.spines[pos].set_visible(False)ax2.spines[pos].set_visible(False)plt.grid()
plt.title("Global temperature anomaly and atmospheric CO$_2$ emissions concentration\n (1959-2021)",pad = 20)plt.show()

图片

reference

  1. https://www.nytimes.com/2022/09/14/world/asia/pakistan-floods.html

  2. https://multimedia.scmp.com/infographics/news/china/article/3190803/china-drought/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/93511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PostgreSQL】【存储管理】表和元组的组织方式

外存管理负责处理数据库与外存介质(PostgreSQL8.4.1版本中只支持磁盘的管理操作)的交互过程。在PostgreSQL中,外存管理由SMGR(主要代码在smgr.c中)提供了对外存的统一接口。SMGR负责统管各种介质管理器,会根据上层的请求选择一个具体的介质管理器进行操作…

凉鞋的 Godot 笔记 105. 第一个通识:编辑-测试 循环

105. 第一个通识:编辑-测试 循环 在这一篇,我们简单聊聊此教程中所涉及的一个非常重要的概念:循环。 我们在做任何事情都离不开某种循环,比如每天的 24 小时循环,一日三餐循环,清醒-睡觉循环。 在学习一…

首发Orin N芯片,腾势追赶「智驾第一梯队」

张祥威 编辑 | 德新 英伟达最新一代芯片—— Orin N,腾势拿下 首发。 9月26日,腾势N7推出「高快智驾包」。官方描述中,这一选装将“基于新一代NIVIDIA DRIVE ORIN的 高性能平台”,可以实现高速NOA。 此前,腾势的…

从零手搓一个【消息队列】实现虚拟主机的核心功能

文章目录 一、虚拟主机设计二、实现虚拟主机1, 创建 VirtualHost 类2, VirtualHost() 构造方法3, exchangeDeclare() 创建交换机4, exchageDelete() 删除交换机5, queueDeclare() 创建队列6, queueDelete() 删除队列7, queueBind() 创建绑定8, queueUnBind() 删除绑定9, basicP…

vscode 注释插件koroFileHeader

https://blog.51cto.com/u_15785499/5664323 https://blog.csdn.net/weixin_67697081/article/details/129004675

YoloV5实时推理最短的代码

YoloV5实时推理最简单代码 import cv2 import torch# 加载YOLOv5模型 model torch.hub.load(ultralytics/yolov5, yolov5s)# 使用CPU或GPU进行推理 device cuda if torch.cuda.is_available() else cpu model.to(device)# 打开摄像头(默认摄像头) cap…

vue pc端/手机移动端 — 下载导出当前表格页面pdf格式

一、需求:在手机端/pc端实现一个表格页面(缴费单/体检报告单等)的导出功能,便于用户在本地浏览打印。 二、实现:之前在pc端做过预览打印的功能,使用的是print.js之类的方法让当前页面直接唤起打印机的打印预…

【好玩的开源项目】Docker部署cook菜谱工具

【好玩的开源项目】Docker部署cook菜谱工具 一、cook菜谱工具介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本 四、下载cook镜像五、部署cook菜谱工具5.1 创建cook容器5.2 查看容器状态5.3 检查容器日志 六、…

Oracle is和as 关键字学习

之前写的Oracle存储过程中都有is和as关键字;下面学习这二个关键字; Oracle中is可用于以下情况: 判断某个值是否为null。在Oracle中,null表示一个未知或不适用的值。因此,我们需要使用is null或is not null语句来检查某…

OpenNebula的配置与应用

学习了OpenNebula的安装之后,接下来就是配置OpenNebula,内容包括配置Sunstone,VDC和集群,设置影像,模板管理,虚拟机管理等。OpenNebula还有大量的工作要做,这些工作主要来自映像、模板和虚拟机管…

Redis主从复制、哨兵、cluster集群

目录 Redis 主从复制 主从复制的作用 主从复制流程 搭建Redis 主从复制 实验环境 所有主机安装redis 修改 Redis 配置文件(Master节点操作) 修改 Redis 配置文件(Slave节点操作) 验证主从效果 Redis 哨兵模式 哨兵模式的…

算法通过村第十一关-位运算|黄金笔记|位运算压缩

文章目录 前言用4kb内存寻找重复元素总结 前言 提示:如果谁对你说了地狱般的话,就代表了他的心在地狱。你不需要相信那样的话,就算对方是你的父母也一样。 --高延秀《远看是蔚蓝的春天》 位运算有个很重要的作用就是能用比较小的空间存储比较…

思科:iOS和iOSXe软件存在漏洞

思科警告说,有人试图利用iOS软件和iOSXe软件中的一个安全缺陷,这些缺陷可能会让一个经过认证的远程攻击者在受影响的系统上实现远程代码执行。 中严重程度的脆弱性被追踪为 CVE-2023-20109 ,并以6.6分得分。它会影响启用Gdoi或G-Ikev2协议的软件的所有版本。 国际知名白帽黑客…

世界前沿技术发展报告2023《世界航天技术发展报告》(二)卫星技术

(二)卫星技术 1.概述2. 通信卫星2.1 美国太空发展局推进“国防太空体系架构”,持续部署“传输层”卫星2.2 美国军方在近地轨道成功演示验证星间激光通信2.3 DARPA启动“天基自适应通信节点”项目,为增强太空通信在轨互操作能力提供…

程序员的重复劳动陷阱

https://kb.cnblogs.com/page/627035/ 同样是一样的计算机专业毕业,进入职场的职位和工作都差不多,为何有些程序员短短几年就成长为全能选手或领域专家,有些程序员还在做CRUD? 程序员的重复劳动陷阱 不知道大家有没有这样的感觉…

2023年中国医疗传感器行业现状分析:市场国有化率低[图]

传感器是对物理刺激(如热、光、声、压力、磁或特定的运动)作出反应并传送产生的脉冲(如用于测量或操作控制)的装置。传感器一般由敏感元件、转换元件和转换电路组成。 医疗传感器分类 资料来源:共研产业咨询&#xff…

管道-有名管道

一、有名管道 有名管道与匿名管道的不同: 有名管道提供了一个路径名,并以FIFO的文件形式存在于文件系统中。与匿名管道不同,有名管道可以被不相关的进程使用,只要它们可以访问该路径,就能够通过有名管道进行通信。 FI…

基于SSM的学生事务处理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

GROMACS Tutorial 5: Protein-Ligand Complex 中文实战教程

GROMACS Tutorial 5: Protein-Ligand Complex 中文实战教程 前言系统环境特别强调一、预处理阶段1.1 蛋白质配体分离以及除水操作1.2 选择力场识别JZ4配体1.2.1 使用在线力场解析1.2.2 使用官方推荐力场CHARMM36解析 1.3 蛋白的top文件准备1.4 配体的top文件准备1.5 使用CgenFF…