如何用ggplot2绘制漂亮的统计图形 您所在的位置:网站首页 绘制树叶统计图怎么画 如何用ggplot2绘制漂亮的统计图形

如何用ggplot2绘制漂亮的统计图形

2024-06-02 15:15| 来源: 网络整理| 查看: 265

导言

ggplot2 是由 Hadley Wickham 开发的一个功能十分强大的 R 语言绘图程序包,它能够非常轻松的画出各种好看的统计图形。关于 ggplot2 的教程有很多,Cédric Scherer 博士的这篇blog(“A ggplot2 Tutorial for Beautiful Plotting in R”)是我目前为止看到过的最棒的 ggplot2 教学,讲得非常全面且详细。因此,在自己学习的同时希望将它分享给更多相关专业的同学。

blog原文链接:https://cedricscherer.netlify.app/2019/08/05/a-ggplot2-tutorial-for-beautiful-plotting-in-r/#prep本文翻译&整理了 Cédric Scherer 的这篇 blog,为了让它更加容易理解,也参考了其它相关的资料,对部分内容进行了补充和改写。此外,这项工作也得到了 Cédric Scherer 博士本人的授权以及支持。

由于整篇教学十分全面且详细,故篇幅也较大,因此将其整理为以下内容,并将在随后分期推送,希望感兴趣的同学可以持续关注,也可加入我们共同交流,分享你的宝贵经验。第一期:ggplot2基础(一)—— A default ggplot, axes, titles第二期:ggplot2基础(二)—— Legends, backgrounds & grid lines, margins第三期:ggplot2基础(三)—— Colors, themes第四期:ggplot2基础(四)—— lines, text第五期:ggplot2基础(五)—— Multi-Panel plots, Chart types第六期:ggplot2基础(六)—— Coordinates, ribbons, smoothings第七期:ggplot2之交互图(Interactive Plots)

第一期:ggplot2基础(一)

A default ggplot, axes, titles

摘要:

本期内容将会介绍 ggplot2 绘图语法的基础,以及如何调整图形坐标轴的内容和外观,修改图形标题等内容。

关于 ggplot2 包

ggplot2 是一个基于图形语法(The Grammar of Graphics)的绘图系统。简单来说,你只需要提供数据(data),并告诉 ggplot2 如何将变量映射到美学(aesthetics),使用什么图形元素(geoms),然后它将会处理剩余的细节。

什么是图形语法?

Wilkinson 创建了图形语法来描述所有统计图形背后的基本特性。图形语法是对“什么是统计图形”这个问题的回答。ggplot2 建立在 Wilkinson 语法的基础上,它关注于图层(layer)的优先地位,并对其进行调整,以便在 R 中使用。简而言之,图形语法告诉我们图形将数据映射到几何对象(点、线、条)的美学属性(颜色、形状、大小)。图形还可以包括关于绘图坐标系统的数据和信息的统计变换。分面(facet)可用于绘制数据的不同子集。这些独立组件的组合构成了完整的图形。所有的图形都是由数据(data)、你想要可视化的信息和一个映射(map,如何将数据变量映射到美学属性的描述)组成的。有五个映射组件:

1)图层:几何元素和统计变换的集合。几何元素(geoms)代表了你在图中所看到的东西:如点、线、多边形等等;统计转换(stats)对数据进行总结:例如,对观察数据进行分类和计数以创建直方图,或拟合线性模型等。

2)尺度(Scale):将数据空间中的值映射到美学空间中的值。这包括颜色、形状和大小的使用。尺度还会绘制图例和坐标轴,这使得从图中读取原始数据的值成为可能(反向映射);

3)坐标系统:描述数据坐标如何映射到图形的平面上。它还提供轴线(axes)和网格线(gridlines)来帮助阅读图表。我们通常使用笛卡尔坐标系,但也有其他一些方法,包括极坐标和地图投影。

4)分面:指定如何分解数据子集并将其显示为小的图形。

5)主题:控制更精细的显示点,如字体大小和背景颜色。虽然 ggplot2 谨慎地选择了默认值,但你可能需要参考其他参考资料来创建有吸引力的图。

由于本文涉及大量的统计图形元素,在正式进入教程之前,希望明确这些元素的名称,以免引起混乱。下面展示了一个常见的统计图形(直方图)的基本结构和常见的元素:

(个人翻译 仅供参考)

以及常见的统计图形名称:

Scatter plot 散点图

Line plot 线图

Histogram plot 直方图

Box plot 箱形图

Part 1 从一个默认的ggplot开始

| Preparation

1)需要安装的 R 包

tidyverse 包,同样出自 Hadley Wickham 大神之手,包含了 ggplot2,dplyr,tidyr,readr,purrr,tibble,stringr, forcats 等多个包:

ggplot2, for data visualisation (数据可视化)

dplyr, for data manipulation (数据预处理)

tidyr, for data tidying (清理数据,转为 ggplot 可用的格式)

readr, for data import (读取数据)

purr, for functional programming (提供好用的编程函数)

tibble, for tibbles, a modern re-imagining of data frames (data.frame 升级款)

stringr, for strings. (处理字符,查找、替换等)

forcats, for factors. (处理因子问题)

showtext 包,一个字体包。

2)数据集

本文使用的数据来自 National Morbidity and Mortality Air Pollution Study(全国空气污染发病率和死亡率研究,NMMAPS),选取了 Chicago 市 1997-2000 年的数据。

(本数据集可在文末提供的链接进行下载)

首先加载 ggplot2 包或者 tidyverse 包(后者包含了 ggplot2 等多个包)

# library(ggplot2) library(tidyverse)

ggplot2 的语法与 R 的基础绘图语法不同,根据基本元素,一个默认的 ggplot 图需要指定以下内容:数据,美学和几何图形;

step 1. 定义一个绘图对象ggplot2 绘图的第一步就是要指定绘图所需要的数据以及坐标轴对应的变量:

(g  20) # 选取部分数据 ggplot(chic_high, aes(x = temp, y = o3)) + geom_point(color = "darkcyan") + labs(x = "Temperature higher than 25°F", y = "Ozone higher than 20 ppb") + expand_limits(x = 0, y = 0)

个人感觉这个功能有点鸡肋,也就是当你的数据范围比较大时,绘图的起始点仍然从 0 开始。使用 coord_cartesian(xlim = c(0, NA), ylim = c(0, NA)) 可以达到同样的效果。

ggplot(chic_high, aes(x = temp, y = o3)) + geom_point(color = "darkcyan") + labs(x = "Temperature higher than 25°F", y = "Ozone higher than 20 ppb") + coord_cartesian(xlim = c(0, NA), ylim = c(0, NA))

或者像这样: 

ggplot(chic_high, aes(x = temp, y = o3)) + geom_point(color = "darkcyan") + labs(x = "Temperature higher than 25°F", y = "Ozone higher than 20 ppb") + expand_limits(x = 0, y = 0) + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0)) + coord_cartesian(clip = "off")

(注意与上图的区别,原点的位置变了)

参数 clip = "off" 允许在面板区域之外绘制。也就是把图层画在画布之外,关于这个问题的详细描述参见https://guangchuangyu.github.io/2018/05/ggplot2-clip/

此处调用它是为了确保 c(0,0) 处的刻度没有被切掉。

 

9. 相同比例的坐标轴

就是让 x 轴和 y 轴的刻度比例保持一致。为了展示,让我们画出原始温度与添加了一些随机噪声(在原有数值上添加随机数)的温度的散点图。coord_equal() 是一个具有指定比率的坐标系统,默认值 ratio = 1 确保 x 轴上的一个单位与 y 轴上的一个单位具有相同的长度:

ggplot(chic, aes(x = temp, y = temp + rnorm(nrow(chic), sd = 20))) + geom_point(color = "sienna") + labs(x = "Temperature (°F)", y = "Temperature (°F) + random noise") + xlim(c(0, 100)) + ylim(c(0, 150)) + coord_fixed()

( x 轴上的 0-50 与 y 轴的 0-50 长度是相同的,拥有相同的比例)

 

而 ratio 大于 1 时 y 轴上的单位比 x 轴上的单位长,反之则短。

ggplot(chic, aes(x = temp, y = temp + rnorm(nrow(chic), sd = 20))) + geom_point(color = "sienna") + labs(x = "Temperature (°F)", y = "Temperature (°F) + random noise") + xlim(c(0, 100)) + ylim(c(0, 150)) + coord_fixed(ratio = 1/5)

10. 使用函数来改变标签

有时修改一下(刻度)标签是很方便的,可以添加单位或百分比符号而不将它们添加到数据中。在这种情况下,你可以使用函数来完成:

ggplot(chic, aes(x = date, y = temp)) + geom_point(color = "firebrick") + labs(x = "Year", y = NULL) + scale_y_continuous(label = function(x) {return(paste(x, "Degrees Fahrenheit"))})

(就是把原有的刻度与表示单位的字符串“粘贴”在了一起)

Part 3  Working with titles (标题)

1. 添加一个(图)标题

使用 ggtitle() 函数来可以为图形添加一个标题:

ggplot(chic, aes(x = date, y = temp)) + geom_point(color = "firebrick") + labs(x = "Year", y = "Temperature (°F)") + ggtitle("Temperatures in Chicago")

或者,你也可以使用 labs() 你可以添加一些参数,如补充的副标题,标签 tag,备注 caption:

ggplot(chic, aes(x = date, y = temp)) + geom_point(color = "firebrick") + labs(x = "Year", y = "Temperature (°F)", title = "Temperatures in Chicago", subtitle = "Seasonal pattern of daily temperatures from 1997 to 2001", caption = "Data: NMMAPS", tag = "Fig. 1")

2. 标题加粗并在基线处添加空格

因为图标题属于主题元素,所以我们使用 theme() 函数和文本元素 axis.title 和 axis.text 来修改字体和边距。以下所有主题元素的修改不仅适用于标题,也适用于所有其他标签,如plot.subtitle, plot.caption, plot.caption, legend.title, legend.text, axis.title 和 axis.text

ggplot(chic, aes(x = date, y = temp)) + geom_point(color = "firebrick") + labs(x = "Year", y = "Temperature (°F)", title = "Temperatures in Chicago") + theme(plot.title = element_text(face = "bold", margin = margin(10, 0, 10, 0), size = 14))

(margin 函数中的四个参数依次为 t(top),r(right),b(bottom) 和 l(left),可以这样来记:“t-r-oub-l-e”)

3. 调整标题位置

一般对齐(左、中、右)由 hjust(表示水平调整)来控制;当然也可以调整垂直对齐,使用vjust来控制。

ggplot(chic, aes(x = date, y = temp)) + geom_point(color = "firebrick") + labs(x = "Year", y = NULL, title = "Temperatures in Chicago", caption = "Data: NMMAPS") + theme(plot.title = element_text(hjust = 1, size = 16, face = "bold.italic"))

也可以根据面板区域通过 plot.title.position 和 plot.caption.position 指定标题、副标题和 caption 的对齐方式。在大多数情况下,后者在设计上确实是更好的选择,许多人都很喜欢这个新功能,特别是在 y 轴标签很长的情况下,对齐看起来很糟糕:

(g


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有