跟着顶级科研报告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…

C#实现十大经典排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、堆排序、计数排序、桶排序、基数排序

以下是使用C#实现十大经典排序算法的示例代码: 1. 冒泡排序(Bubble Sort) void BubbleSort(int[] array) {int n = array.Length;for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - i - 1; j++){if (array[j] > array[j + 1]){int temp = array[j];array…

软考 系统架构设计师系列知识点之软件架构风格(4)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件架构风格&#xff08;3&#xff09; 这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此…

vscode 注释插件koroFileHeader

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

2020ICPC银川(A E G J K)

2020ICPC银川(A E G J K) 2020ICPC银川 A. Best Player&#xff08;模拟&#xff09; 在某一维方向上无法区分的点显然另两维坐标相同 &#xff0c; 那么在当前维度上能区分的点个数就是本质不同的另两维坐标组成的点对的个数 &#xff0c; 用set维护一下即可。 #include&l…

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)# 打开摄像头&#xff08;默认摄像头&#xff09; cap…

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

一、需求&#xff1a;在手机端/pc端实现一个表格页面&#xff08;缴费单/体检报告单等&#xff09;的导出功能&#xff0c;便于用户在本地浏览打印。 二、实现&#xff1a;之前在pc端做过预览打印的功能&#xff0c;使用的是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关键字&#xff1b;下面学习这二个关键字&#xff1b; Oracle中is可用于以下情况&#xff1a; 判断某个值是否为null。在Oracle中&#xff0c;null表示一个未知或不适用的值。因此&#xff0c;我们需要使用is null或is not null语句来检查某…

JS合并2个远程pdf

要在HTML和JavaScript中读取远程PDF文件的矢量数据并合并两个PDF文件&#xff0c;您可以使用pdf-lib和Axios库。以下是使用pdf-lib和Axios在HTML和JavaScript中读取和合并远程PDF文件的步骤&#xff1a; 1. 引入 首先&#xff0c;确保您在HTML文件中引入了pdf-lib和Axios库。…

MySQL的索引问题

1、关于索引 1.1 首先来看一下的关于对索引的理解 索引是一个单独的、存储在磁盘上的数据库结构&#xff0c;包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行&#xff0c;所有MySQL列类型都可以被索引&#xff0c;对相关列使用索引…

恼人的TCP套接字部分发送成功场景

源起 以前就知道套接字有可能出现部分发送成功的可能&#xff0c;直到近段时间一个典型的使用场景触发了明确的此问题&#xff0c;才予以重视&#xff0c;比较深入地考虑解决这个问题的方案&#xff01; 分析 因为TCP的流式特征&#xff0c;如果出现部分发送成功&#xff0c…

OpenNebula的配置与应用

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

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

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

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

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

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

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

AtCoder Beginner Contest 322

A - First ABC 2 AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; int n; string s; void solve() {cin>>n>>s;s s;for(int i1;i<n-2;i){if(s[i]A&&s[i1]B&&s[i2]C){cout<<i<&l…