跳至主要内容

使用 ggplot2 可视化气候变化数据:一步步教程

学习如何在 R 中使用 ggplot2 创建引人注目的气候变化数据可视化。本分步教程将指导您查找、分析并可视化历史气象数据。
· 11分钟 阅读

使用 AI 探索

本教程由我们的社区贡献,已由 DataCamp 为确保清晰与准确进行编辑。

有兴趣分享您的专业经验吗?我们非常期待!欢迎通过我们的 社区投稿表单提交您的文章或想法。

“全球变暖不是预测,它正在发生”——James Hansen

气候变化是影响我们所有人的紧迫议题,数据可视化是提升认知的有力工具。在本分步教程中,您将学习如何在 R 中使用 ggplot2 创建对历史气候数据具有影响力的可视化。读完本指南,您将知道如何查找精选数据集、绘制历史气象数据,并自定义图形来讲述一个有说服力的故事。

气候变化是影响我们所有人的紧迫议题,数据可视化是提升认知的有力工具。在本分步教程中,您将学习如何在 R 中使用 ggplot2 创建对历史气候数据具有影响力的可视化。读完本指南,您将知道如何查找精选数据集、绘制历史气象数据,并自定义图形来讲述一个有说服力的故事。

在本教程中,您将了解去哪里可以找到可靠且经过整理的历史气温数据,并用 ggplot2 对其进行可视化。

  • 了解在哪里可以找到包含历史气象数据的精选数据集;
  • 熟练使用 ggplot2 绘制历史气象数据;
  • 能够自定义 ggplot2 图形以更好地讲述您的故事。

步骤 1:查找并加载数据

本教程所用数据可在 美国国家环境信息中心(NCEI)获取。NCEI 是美国环境数据的权威机构,提供关于气候、生态系统和水资源的高质量数据。GSOY(Global Summary of the Year)数据集按城市和气象站提供历史气象数据。本教程将使用加利福尼亚州伯克利的数据。您也可以选择自己偏好的城市。

我们将使用 read_csv 加载数据。第一个参数是文件路径,第二个参数 col_select 用于告诉 R 您要加载哪些列。注意该数据集包含多个变量,但我们只关心 “DATE” 和 “TAVG”。“DATE” 表示观测年份,“TAVG” 是以摄氏度给出的年平均气温。关于可用变量的更多信息,请参阅数据集代码手册。

library(readr)2​3df <- read_csv('USC00040693.csv',4            col_select = c("DATE", "TAVG"))5​Rows: 118 Columns: 2── Column specification ────────────────────────────────────────────────────────Delimiter: ","dbl (2): DATE, TAVG

下面我们将打印数据集及其汇总统计,以便对数据有初步了解。R 的 summary() 函数告诉我们,数据范围从 1893 年到 2019 年,在此期间伯克利(加州)观测到的最低年平均气温为 12.9 °C,最高年平均气温为 15.93 °C。

summary(df)      DATE           TAVG       Min.   :1893   Min.   :12.90   1st Qu.:1926   1st Qu.:13.50   Median :1956   Median :13.91   Mean   :1956   Mean   :13.97   3rd Qu.:1985   3rd Qu.:14.33   Max.   :2019   Max.   :15.93                  NA's   :33     

步骤 2:处理缺失值

summary() 函数显示有 33 个缺失气温值。您也可以使用 is.na() 函数检查某个变量中的 NA;当观测为 NA 时返回 TRUE。随后可将所有缺失值求和。sum() 会将 TRUE 转换为 1。

print(paste("There are", sum(is.na(df$TAVG)), "missing values in this dataset."))[1] "There are 33 missing values in this dataset."

鉴于我们正在处理时间序列,将使用线性插值填补缺失值。该方法假定在缺失期间数据线性变化。事实上,当您用折线图绘制时间序列时,即便没有缺失值,观测点之间的区间也同样由连接两点的直线填充。

为进行线性插值,我们将使用 imputeTS 包。安装并加载库后,可使用 na_interpolation() 填补缺失值。它接收两个参数:首先是您要处理的数据框列,其次是用于插补的方法。

install.packages("imputeTS", quiet = TRUE)
library(imputeTS)Registered S3 method overwritten by 'quantmod':  method            from  as.zoo.data.frame zoo 
df$TAVG <- na_interpolation(df$TAVG, option ="linear")

步骤 3:绘制第一版图形

ggplot2 可视化由多个图层构成。如下图所示,每个图层包含一个几何对象(geom),即您在图中看到的一个元素(例如线或点)。

首先,您需要向 ggplot() 函数传入一个数据集。其次,您将变量映射到美学属性——即几何对象的可视属性。例如在 y 轴位置、x 轴位置、颜色或大小等。想进一步了解 ggplot,请查看由 Rick Scavetta 讲授的“使用 ggplot2 进行数据可视化入门”课程,我从他那里学到了很多可视化技能。

ggplot2 图层。图片由作者绘制。

下面,我们的映射(aes())告诉 ggplot:x 轴位置取决于变量 “DATE”,y 轴位置取决于温度。请注意,如果只绘制这一图层,ggplot 只会显示坐标轴。

此外,在开始使用 ggplot 之前,我们将设置一些应用于所有图形的全局配置。第一项是图形大小与分辨率;第二项是主题。

library(ggplot2)options(repr.plot.width = 10, repr.plot.height = 6, repr.plot.res = 150 )theme_set(theme_bw())
axes <- ggplot(data = df, aes(x = DATE, y = TAVG))axes

现在,您可以添加第二个图层,用点表示各年的气温。注意,您可以在上一步创建的图形上叠加该图层。

dot_plot <- axes + geom_point()dot_plot

最后,您可以再添加第三个包含折线的图层。需要强调的是,有些作者认为折线并不代表观测数据,应谨慎使用。有关完整讨论,请参阅 Claus O. Wilke 的《数据可视化基础》第 13 章。

dot_plot +geom_line()

步骤 4:自定义图形

本节将介绍如何自定义图形,使其清晰、信息量足且美观。

首先,为使气温上升趋势更直观,我们将把点的颜色美学也映射到 “TAVG”。由于它是数值变量,ggplot2 会使用渐变色来表示连续取值。您可以通过 scale_color_gradient() 选择代表低温与高温的颜色。

此外,您可以分别使用 xlab() 和 ylab() 设置 x、y 轴标签,用 ggtitle() 添加标题。最后,我们将增大点的大小并设置透明度,以便在重叠处仍能看清数据。

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+scale_color_gradient(name = "ºC", low = "#47BEFB", high = "#ED6AA8")+ggtitle("Historical air temperature trend in Berkeley, CA")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")

Edward Tufte 是数据可视化领域的专家,主张最大化用于呈现非冗余数据的“墨水”比例。作者认为,这样可以让图形更清晰,避免分散读者注意力。

我们使用的 ggplot2 主题(theme_bw())已与 Tufte 的建议大体一致,但在上图中我们仍可移除面板网格。为此,使用 theme() 函数,并传入 panel.grid.minor = element_blank() 与 panel.grid.major = element_blank() 两个参数。

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+scale_color_gradient(name = "ºC", low =  "#47BEFB", high = "#ED6AA8")+ggtitle("Historical air temperature trend in Berkeley, CA")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme(# Eliminates grids:        panel.grid.minor = element_blank(),        panel.grid.major = element_blank())

步骤 5:为可视化创建一个 ggplot2 主题

现在,您将学习如何创建自己的 ggplot2 主题。作为示例,我们将创建一个 theme_datacamp(),使图形更符合 DataCamp 网站的风格与和谐度。

首先,我们创建了一个包含部分 DataCamp 配色的列表,便于后续使用。

datacamp_colors <- list(green = "#74F065",                         darkblue = "#05192D",                         blue = "#47BEFB",                         pink = "#ED6AA8")

其次,我们将加载名为 “Manjari” 的 Google 字体以在主题中使用。您可以通过 “showtext” 包轻松加载。如果尚未安装,请先安装该包。

install.packages("showtext", quiet = TRUE)

下面我们加载该包,并用 font_add_google() 加载 “Manjari”。同时用 showtext_auto() 告诉 R 使用 “showtext” 来渲染文本:

library(showtext)font_add_google("Manjari")showtext_auto()Loading required package: sysfontsLoading required package: showtextdb

现在,我们将使用 theme() 自定义图形。下图展示了可用的部分参数。完整列表请参阅ggplot2 参考文档。

 

主题参数。图片由作者绘制。

您可以通过一个函数来创建新主题,在其中调用 ggplot2 的 theme() 并填入自定义规格。注意我们以黑白主题(theme_bw())为基础,然后移除网格并更改背景、面板和文本颜色。此外,为图形添加了 0.5 厘米外边距。为便于后续修改,我们为用户提供了两个参数,用于指定文本/面板颜色与背景颜色。

theme_datacamp <- function(text_panel_color, background_color) {  theme_bw()+  theme(text=element_text(size=28, family="Manjari", face = "bold", color = text_panel_color),    	# Eliminates grids        panel.grid.minor = element_blank(),        panel.grid.major = element_blank(),    	# Changes panel, plot and legend background to dark blue        panel.background = element_rect(fill = background_color),        plot.background = element_rect(fill =  background_color),        legend.background = element_rect(fill= background_color),        # Changes legend texts color to white        legend.text =  element_text(color = text_panel_color,                                     margin = margin(0, 0, 0, -0.5, "cm")),        legend.title = element_text(color = text_panel_color),        legend.text.align = 0,        # Changes color of plot border to white        panel.border = element_rect(size = 1, color = text_panel_color),        # Changes color of axis texts to white        axis.text.x = element_text(color = text_panel_color),        axis.text.y = element_text(color = text_panel_color),        axis.title.x = element_text(color= text_panel_color),        axis.title.y = element_text(color= text_panel_color),        # Changes axis ticks color to white        axis.ticks.y = element_line(color = text_panel_color),        axis.ticks.x = element_line(color = text_panel_color),        # Adds margin        plot.margin = margin(1, 1, 1, 1, "cm")  )}

现在,您只需将 theme_datacamp() 添加到图形中,并指定您偏好的颜色。这里我使用了 Datacamp 配色:

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+scale_color_gradient(name = "ºC", low = datacamp_colors$blue, high = datacamp_colors$pink)+ggtitle("Historical air temperature trend in Berkeley, CA")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme_datacamp(text_panel_color = datacamp_colors$green,                background_color = datacamp_colors$darkblue)

最后,您可以按 Claus O. Wilke 在《数据可视化基础》第 14 章中的推荐,使用 LOESS(局部加权回归平滑)曲线展示温度趋势。方法是在 ggplot 中添加包含 geom_smooth() 的图层。

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+geom_smooth(color = datacamp_colors$green, se = FALSE)+scale_color_gradient(name = "ºC", low = datacamp_colors$blue, high = datacamp_colors$pink)+ggtitle("Historical air temperature trend in Berkeley, CA",       subtitle = "Visualization using theme_datacamp()")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme_datacamp(text_panel_color = datacamp_colors$green,                background_color = datacamp_colors$darkblue)

欢迎尝试其他颜色与字体组合,打造更具表现力的可视化。比如下方示例中,我将 LOESS 曲线、面板与文字颜色改为白色。

ggplot(data = df, aes(x = DATE, y = TAVG, color = TAVG))+geom_point(size = 7, alpha = 0.8)+geom_smooth(color = "white", se = FALSE)+scale_color_gradient(name = "ºC", low = datacamp_colors$blue, high = datacamp_colors$pink)+ggtitle("Historical air temperature trend in Berkeley, CA",       subtitle = "Visualization using theme_datacamp()")+xlab("Year")+ylab("Annual Mean Temperature in Berkeley [ºC]")+theme_datacamp(text_panel_color = "white",                background_color = datacamp_colors$darkblue)

结语

在本教程中,您学习了如何在 R 中使用 ggplot2 高效地可视化历史气候数据。我们涵盖了从获取可靠数据到创建自定义 ggplot2 主题的全过程,帮助您用数据可视化提升人们对气候变化的认知。

下一步,建议继续深入学习数据可视化与 R 编程,参阅 DataCamp 的使用 ggplot2 进行数据可视化入门与中级 R课程。这些课程将帮助您在此基础上再进阶,应对更复杂的项目。

主题