跟着顶级科研报告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.xdnf.cn/news/147417.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④ 第十九章 驱动程序基石④19.7 工作队列19.7.1 内核函数19.7.1.1 定义 work19.7.1.2 使用 work:schedule_work19.7.1.3 其他函数 19.7.2 编程、上机19.7.3 内部机制19.7.3.1 Linux 2.x的工作队列创建过程19.7.3…

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令,包括:if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令,请参考:BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…

八大排序(三)堆排序,计数排序,归并排序

一、堆排序 什么是堆排序:堆排序(Heap Sort)就是对直接选择排序的一种改进。此话怎讲呢?直接选择排序在待排序的n个数中进行n-1次比较选出最大或者最小的,但是在选出最大或者最小的数后,并没有对原来的序列…

Python无废话-办公自动化Excel修改数据

如何修改Excel 符合条件的数据?用Python 几行代码搞定。 需求:将销售明细表的产品名称为PG手机、HW手机、HW电脑的零售价格分别修改为4500、5500、7500,并保存Excel文件。如下图 Python 修改Excel 数据,常见步骤: 1&…

docker 基本操作

目录 一、docker 概述 二、容器 2.1容器的特性 2.2namespace的六项隔离 三、docker与虚拟机的区别 四、Docker核心概念 五、docker 基本操作命令 镜像操作 1、搜索镜像 2、获取镜像 3、查看镜像信息 ​编辑 4、查看下载的镜像文件信息 5、查看下载到本地的所有镜…

搭建智能桥梁,Amazon CodeWhisperer助您轻松编程

零:前言 随着时间的推移,人工智能技术以惊人的速度向前发展,正掀起着全新的编程范式革命。不仅仅局限于代码生成,智能编程助手等创新应用也进一步提升了开发效率和代码质量,极大地推动着软件开发领域的快速繁荣。 当前…

SpringCloud(一)Eureka、Nacos、Feign、Gateway

文章目录 概述微服务技术对比 Eureka服务远程调用服务提供者和消费者Eureka注册中心搭建注册中心服务注册服务发现Ribbon负载均衡负载均衡策略饥饿加载 NacosNacos与Eureka对比Nacos服务注册Nacos服务分集群存储NacosRule负载均衡服务实例权重设置环境隔离 Nacos配置管理配置热…

用于自然语言处理的 Python:理解文本数据

一、说明 Python是一种功能强大的编程语言,在自然语言处理(NLP)领域获得了极大的普及。凭借其丰富的库集,Python 为处理和分析文本数据提供了一个全面的生态系统。在本文中,我们将介绍 Python for NLP 的一些基础知识&…

2023 彩虹全新 SUP 模板,卡卡云模板修复版

2023 彩虹全新 SUP 模板,卡卡云模板,首页美化,登陆页美化,修复了 PC 端购物车页面显示不正常的问题。 使用教程 将这俩个数据库文件导入数据库; 其他的直接导入网站根目录覆盖就好; 若首页显示不正常&a…

计算机网络学习易错点(持续更新~~~)

目录 概述 1.internet和Internet的区别 2.面向连接和无连接 3.不同的T 4.传输速率和传播速率 5.传播时延和传输时延(发送时延) 6.语法,语义和同步 一.物理层 1.传输媒体与物理层 2.同步通信和异步通信 3.位同步(比特同…

nginx多文件组织

背景: nginx的话,有时候,想部署多个配置,比如:使用不同的端口配置不同的web工程。 比如:8081部署:项目1的web页面。 8082部署:项目2的web页面。 1)nginx.conf worker_processes…

Google vs IBM vs Microsoft: 哪个在线数据分析师证书最好

Google vs IBM vs Microsoft: 哪个在线数据分析师证书最好? 对目前市场上前三个数据分析师证书进行审查和比较|Madison Hunter 似乎每个重要的公司都推出了自己版本的同一事物:专业数据分析师认证,旨在使您成为雇主的下一个热门商品。 随着…

7.JavaScript-vue

1 JavaScript html完成了架子,css做了美化,但是网页是死的,我们需要给他注入灵魂,所以接下来我们需要学习JavaScript,这门语言会让我们的页面能够和用户进行交互。 1.1 介绍 通过代码/js效果演示提供资料进行效果演…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤ 第十九章 驱动程序基石⑤19.9 mmap19.9.1 内存映射现象与数据结构19.9.2 ARM架构内存映射简介19.9.2.1 一级页表映射过程19.9.2.2 二级页表映射过程 19.9.3 怎么给APP新建一块内存映射19.9.3.1 mmap调用过程19.9.3.2 cach…

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 memos3.1 memos介绍3.2 Docker 环境搭建…

C语言数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量,比如 runoob0、runoob1、...、runoob99,而…

Scala第十章

Scala第十章 章节目标 1.数组 2.元组 3.列表 4.集 5.映射 6.迭代器 7.函数式编程 8.案例:学生成绩单 scala总目录 文档资料下载

Jmeter分布式压力测试

目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 1、场景 在做性能测试时,单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机…

防火墙基础之H3C防火墙分支与分支之间双向地址转换

分支与分支之间双向地址转换 原理概述: 防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理​与筛选的软件和硬件​设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资…

029-从零搭建微服务-消息队列(一)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…