文章目录
一、基础概念和语法
1、ggplot2 概述
ggplot2 的核心理念:图层语法
ggplot2 是 R 语言中的一个强大数据可视化包,基于“图层语法”(Grammar of Graphics)。图层语法将图表分解为多个可组合的元素(如数据、几何对象、统计变换等),用户可以通过叠加这些元素创建复杂且美观的图表。
2、基本语法
ggplot() 函数
ggplot() 是创建 ggplot2 图表的起点,用于创建一个新的ggplot图形对象。通常需要传入数据框和基本的美学映射(aesthetic mappings)。
示例:
ggplot(data = my_data)
aes() 函数 (aesthetic mappings)
aes() 函数的作用是指定数据集中的哪些变量将被映射到图形的哪些属性(如x轴、y轴、颜色、大小、形状)上,通常在 ggplot() 或几何对象(如 geom_point())中使用。
示例:
ggplot(data = my_data, aes(x = var1, y = var2))
图层概念:+ 操作符
在 ggplot2 中,图表通过图层构建,使用 + 操作符将不同的图层(如几何对象、统计变换、坐标系统等)叠加在一起,逐步构建出完整的图表。
示例:
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
geom_smooth(method = "lm")
二、几何对象 (geometric objects)
常见几何对象:
geom_smooth() # 用于添加一条平滑的曲线,以展示数据的趋势或模式。
geom_point() # 用于在图上绘制散点。
geom_boxplot() # 用于创建箱线图,展示数据的分布情况,包括中位数、四分位数和异常值。
geom_line() # 用于在图上绘制线条,通常用于展示随时间或顺序变化的数据趋势。
geom_bar() # 用于创建条形图,显示分类数据的频数或比例。
geom_histogram() # 用于创建直方图,显示数据分布。
geom_density() # 用于绘制密度图,展示数据的密度估计。
geom_area() # 用于创建面积图,区域图可以用来展示随时间变化的数值变量。
geom_violin() # 用于创建小提琴图,展示数据分布并比较不同组。
geom_errorbar() # 用于添加误差条,展示数据的不确定性。
geom_text() # 用于在图上添加文本标签。
geom_abline() # 用于添加最佳拟合线或直线。
geom_hline() 和 geom_vline() # 分别用于添加水平线和垂直线。
函数名前缀geom的全称是几何对象geometric objects。几何对象函数决定了数据在图形中的具体呈现方式,如点、线、条形等。它们还可以组合使用,以创建复杂的图形。
三、数据映射 (Mapping)
1、映射概述
x 轴和 y 轴映射
在 ggplot2 中,使用 aes() 函数将数据变量映射到图表的 x 轴和 y 轴。这种映射定义了数据如何在图表中呈现,并帮助观察者理解数据的关系和趋势。
示例:
# 将变量 var1 映射到 x 轴,将变量 var2 映射到 y 轴
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point()
色彩、大小、形状映射
除了 x 轴和 y 轴,ggplot2 还支持将其他数据变量映射到图表中的色彩、点的大小和形状等美学属性。通过这种方式,可以同时展示多维数据,丰富图表的信息量。
示例:
# 将变量 var3 映射到点的颜色,将变量 var4 映射到点的大小
ggplot(data = my_data, aes(x = var1, y = var2, color = var3, size = var4)) +
geom_point()
2、因子变量和数值变量
分类变量映射
当数据变量是分类变量(也称为因子变量)时,可以将其映射到图表中的色彩、形状等属性,以区分不同类别之间的差异。这种映射能够使观察者更容易识别和理解数据的分布情况。
示例:
# 将因子变量 var_category 映射到颜色
ggplot(data = my_data, aes(x = var1, y = var2, color = var_category)) +
geom_point()
连续变量映射
对于连续变量,可以将其映射到图表中的色彩、大小等属性,以展示其在不同取值范围内的变化情况。这种映射有助于观察者发现数据中的趋势和模式,并进行进一步的分析和解释。
示例:
# 将连续变量 var_continuous 映射到颜色
ggplot(data = my_data, aes(x = var1, y = var2, color = var_continuous)) +
geom_point()
四、坐标系统 (Coordinate Systems)
1、常用坐标系
Cartesian 坐标系:coord_cartesian()
coord_cartesian() 用于设置图表的笛卡尔坐标系,即常见的直角坐标系。它可以限制绘图区域,但不会改变数据的显示方式。
示例:
# 在直方图中使用 coord_cartesian() 设置 y 轴的范围
ggplot(data = my_data, aes(x = var1)) +
geom_histogram() +
coord_cartesian(ylim = c(0, 100))
极坐标系:coord_polar()
coord_polar() 可以将图表转换为极坐标系,适用于展示周期性数据或环状数据。它将直角坐标系的角度空间转换为圆周空间。
示例:
# 在散点图中使用 coord_polar() 创建极坐标系
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
coord_polar()
翻转坐标系:coord_flip()
coord_flip() 可以将 x 轴和 y 轴交换,将图表从横向显示变为纵向显示,或者反之。
示例:
# 使用 coord_flip() 在直方图中翻转坐标系,使得横轴变为纵轴
ggplot(data = my_data, aes(x = var1)) +
geom_histogram() +
coord_flip()
2、缩放和裁剪
xlim() 和 ylim()
xlim() 和 ylim() 是一个基础R绘图函数,它会限制y轴范围并且过滤掉超出范围的数据点。当使用这个函数绘制箱线图时,会仅用 y∈[0,50] 的点绘制。
示例:
# 使用 xlim() 和 ylim() 设置 x 轴和 y 轴的显示范围
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
xlim(0, 10) + # x轴范围,范围外点会删除
ylim(0, 20) # y轴范围,范围外点会删除
coord_cartesian()
coord_cartesian(ylim = c(0,50)) 是ggplot2包中的一个函数,它不会过滤数据点,只是调整显示的视图范围。这对于保留所有数据点,但只显示部分范围非常有用。当使用这个函数绘制箱线图时,会用所有的点绘制,但只展示 y∈[0,50] 区间的图像。
示例:
coord_cartesian(xlim = c(0,50)) # x轴范围,范围外点会保留
coord_cartesian(ylim = c(0,50)) # y轴范围,范围外点会保留
scale_x_continuous() 和 scale_y_continuous()
scale_x_continuous() 和 scale_y_continuous() 用于调整连续变量的坐标轴,可以设置坐标轴的显示范围、标签、刻度等属性。
示例:
# 使用 scale_x_continuous() 和 scale_y_continuous() 设置坐标轴的显示范围和标签
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
scale_x_continuous(name = "X轴标签", limits = c(0, 10)) +
scale_y_continuous(name = "Y轴标签", breaks = seq(0, 20, by = 5))
五、刻度和标签 (Scales and Labels)
1、刻度设置
连续型刻度:scale_x_continuous(), scale_y_continuous()
scale_x_continuous() 和 scale_y_continuous() 用于调整连续型变量的坐标轴刻度,可以设置刻度的范围、间隔、标签等属性。
示例:
# 使用 scale_x_continuous() 和 scale_y_continuous() 设置连续型坐标轴的刻度
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
scale_x_continuous(name = "X轴标签", limits = c(0, 10), breaks = seq(0, 10, by = 2)) +
scale_y_continuous(name = "Y轴标签", breaks = seq(0, 20, by = 5))
离散型刻度:scale_x_discrete(), scale_y_discrete()
scale_x_discrete() 和 scale_y_discrete() 用于调整离散型变量的坐标轴刻度,可以设置刻度的标签、顺序等属性。
示例:
# 使用 scale_x_discrete() 和 scale_y_discrete() 设置离散型坐标轴的刻度
ggplot(data = my_data, aes(x = factor(var1), y = var2)) +
geom_boxplot() +
scale_x_discrete(name = "X轴标签", labels = c("A", "B", "C", "D"))
2、标签设置
1)labs()
语法:
labs(x = "New x axis label", y = "New y axis label",
title ="Add a title above the plot",
subtitle = "Add a subtitle below title",
caption = "Add a caption below plot",
alt = "Add alt text to the plot",
<aes> = "New <aes> legend title")
labs() 函数用于添加和修改图表的标签、标题、字幕、图例标题和其他描述性文本。以下是各个参数的解释和用法:
x:设置 x 轴的标签。例如,x = “New x axis label” 将 x 轴标签设置为 “New x axis label”。
y:设置 y 轴的标签。例如,y = “New y axis label” 将 y 轴标签设置为 “New y axis label”。
title:设置图表的主标题。例如,title = “Add a title above the plot” 将主标题设置为 “Add a title above the plot”。
subtitle:设置图表的副标题。例如,subtitle = “Add a subtitle below title” 将副标题设置为 “Add a subtitle below title”。
caption:设置图表的说明文字,通常显示在图表的底部。例如,caption = “Add a caption below plot” 将说明文字设置为 “Add a caption below plot”。
alt:设置图表的替代文本(alt text),用于描述图表的内容,这在网页可访问性中很重要。例如,alt = “Add alt text to the plot” 将替代文本设置为 “Add alt text to the plot”。
<aes>:用于设置特定美学映射(aesthetic mapping)的图例标题。例如,如果有一个颜色映射 color = Species,则可以使用 color = “Species Legend” 来设置颜色图例的标题为 “Species Legend”。
示例:
library(ggplot2)
# 示例数据
data(mpg)
# 创建基础图表
p <- ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
geom_point()
# 添加和修改标签、标题等
p + labs(
x = "Engine Displacement (L)",
y = "Highway Miles per Gallon",
title = "Fuel Efficiency of Various Car Models",
subtitle = "Data from the ggplot2 package",
caption = "Source: ggplot2 package",
color = "Car Class"
)
2)xlab() 和 ylab()
labs() 可以设置 x 轴、y 轴、标题、副标题、图例标题以及其他描述性文本,参数更加灵活,可以设置各种不同的标签和标题。而 xlab() 和 ylab() 只能分别设置 x 轴和 y 轴的标签,参数只有一个,即标签的文本内容。
示例:
# 使用 xlab() 和 ylab() 设置 x 轴和 y 轴的标签
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
xlab("X轴标签") +
ylab("Y轴标签")
3)ggtitle()
ggtitle() 用于设置图表的标题。
示例:
# 使用 ggtitle() 设置图表的标题
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
ggtitle("图表标题")
4)guides()
guides() 函数是 ggplot2 中用于设置图表导引(guides)的函数之一。导引包括图例、坐标轴和其他标签,用于帮助解释图表中的数据和视觉元素。
基本用法
guides() 函数用于设置特定图形中的导引元素的属性。它的一般用法是:
guides(<aesthetic> = guide_xxx(...), <aesthetic> = guide_xxx(...), ...)
其中 <aesthetic> 表示要设置的导引元素,可以是图例(legend)、坐标轴(axis)、颜色(color)、大小(size)、形状(shape)等。guide_xxx(…) 是具体的导引类型和其参数设置,例如 guide_legend()、guide_axis() 、guide_colorbar()、guide_colourstrip()等。
设置图例 - guide_legend()
通过 guides() 函数可以设置图例的各种属性,例如标题、位置、方向、键值间距等。示例代码如下:
library(ggplot2)
# 创建基础图表
p <- ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
geom_point()
# 设置图例标题为 "Car Class"
p + guides(color = guide_legend(title = "Car Class"))
设置坐标轴 - guide_axis()
除了设置图例,guides() 函数还可以用于设置坐标轴的属性,例如标签、标尺、方向等。示例代码如下:
# 设置 x 轴标题为 "Engine Displacement"
p + guides(x = guide_axis(title = "Engine Displacement"))
删除导引 - guide_none()
如果您想要删除特定的导引元素,可以将其设置为 guide_none() 或 ‘none’ 。示例代码如下:
# 删除颜色图例
p + guides(color = guide_none())
p + guides(color = 'none')
六、主题和外观 (Themes and Appearance)
1、预设主题:theme_*()
ggplot2 提供了几种预设主题,如灰色、黑白、极简和经典等,可直接应用于图表。
theme_gray() # 默认主题
theme_bw() # 黑白主题
theme_linedraw() # 线条绘制主题
theme_light() # 轻量级主题
theme_dark() # 深色主题
theme_minimal() # 极简主题
theme_classic() # 经典主题
theme_void() # 空白主题
2、自定义主题:theme()
theme() 函数用于自定义图形的非数据元素,例如文本、坐标轴、背景和图例等。通过 theme 函数和其众多可选参数,可以针对图形的每一个部分进行样式调整。
示例:
# 自定义图表主题,修改背景颜色和边框
ggplot(data = my_data, aes(x = var1, y = var2)) +
geom_point() +
theme(panel.background = element_rect(fill = "lightblue"),
panel.border = element_rect(color = "black", fill = NA))
- 按 theme 元素类型介绍
1)文本元素 (element_text)
- axis.title: 坐标轴标题
axis.title.x
axis.title.y
- axis.text: 坐标轴刻度标签
axis.text.x
axis.text.y
- plot.title: 图形标题
- plot.subtitle: 图形副标题
- plot.caption: 图形脚注
- legend.title: 图例标题
- legend.text: 图例文本
可选参数
- size: 文本大小
- color: 文本颜色
- face: 字体风格(如 "bold", "italic", "bold.italic", "plain")
- angle: 文本旋转角度
- hjust: 水平对齐(0 = 左对齐,1 = 右对齐)
- vjust: 垂直对齐(0 = 下对齐,1 = 上对齐)
示例
theme(axis.title.x = element_text(size = 14, face = "bold", color = "blue"))
2)线元素 (element_line)
- axis.line: 坐标轴线
axis.line.x
axis.line.y
- panel.grid: 网格线
panel.grid.major
panel.grid.minor
panel.grid.major.x
panel.grid.major.y
panel.grid.minor.x
panel.grid.minor.y
可选参数
- color: 线条颜色
- size: 线条粗细
- linetype: 线条类型
示例
theme(axis.line = element_line(color = "black", size = 1))
3)线元素 (element_rect)
可选参数
- fill: 矩形填充颜色
- color: 边框颜色
- linetype: 边框线型
- size: 边框大小
示例
theme(panel.background = element_rect(fill = "lightblue", color = "blue", linetype = "dashed", size = 1))
4)空元素 (element_blank)
- 用途: 隐藏特定元素
- 常用场景: 隐藏网格线、图例、坐标轴等。
示例
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
- 按调整对象介绍
1)背景和边框
- plot.background:设置整个图的背景。
theme(plot.background = element_rect(fill = "lightblue", color = "blue"))
- panel.background:设置绘图区域的背景。
theme(panel.background = element_rect(fill = "lightgray", color = "gray"))
- panel.border:设置绘图区域的边框。
theme(panel.border = element_rect(color = "black", fill = NA))
2)网格线
- panel.grid.major:设置主网格线。
theme(panel.grid.major = element_line(color = "gray", linetype = "dashed"))
- panel.grid.minor:设置次网格线。
theme(panel.grid.minor = element_line(color = "gray", linetype = "dotted"))
3)坐标轴
- axis.text:设置坐标轴刻度文字。
theme(axis.text = element_text(color = "black", size = 12))
- axis.text.x:设置 x 轴刻度文字。
theme(axis.text.x = element_text(color = "blue", size = 12, angle = 45, hjust = 1))
- axis.text.y:设置 y 轴刻度文字。
theme(axis.text.y = element_text(color = "green", size = 14))
- axis.title:设置坐标轴标题。
theme(axis.title = element_text(color = "black", size = 14))
- axis.title.x:设置 x 轴标题。
theme(axis.title.x = element_text(color = "red", size = 14, face = "bold"))
- axis.title.y:设置 y 轴标题。
theme(axis.title.y = element_text(color = "purple", size = 14, face = "italic"))
4)图例
- legend.position:设置图例位置,可以是 “left”、“right”、“top”、“bottom”、“none” 或坐标位置如 (0.5, 0.5)。
theme(legend.position = "top")
- legend.title:设置图例标题。
theme(legend.title = element_text(color = "purple", size = 14))
- legend.text:设置图例文字。
theme(legend.text = element_text(color = "orange", size = 12))
- legend.background:设置图例的背景样式,包括背景颜色、边框颜色、边框线型等。
theme(legend.background = element_rect(fill = "lightblue", color = "blue", linetype = "dashed"))
5)标题和标签
- plot.title:设置图形标题。
theme(plot.title = element_text(color = "red", size = 16, face = "bold"))
- plot.subtitle:设置图形副标题。
theme(plot.subtitle = element_text(color = "blue", size = 14))
- plot.caption:设置图形说明文字。
theme(plot.caption = element_text(color = "gray", size = 10))
七、分面 (Facets)
1、分面概述
分面(Facets)在ggplot2中是一种有效的数据可视化方式,通过将数据分成不同的子图来比较不同子集的关系。单维度分面使用facet_wrap()函数,它基于一个变量将数据分成多个面板;而多维度分面使用facet_grid()函数,可以基于两个变量创建二维面板。
示例:
# 单维度分面
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~class)
# 多维度分面
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_grid(drv ~ cyl)
2、调整分面布局
调整分面布局可以通过设置参数ncol和nrow来实现,它们分别控制分面的列数和行数。
示例:
ggplot(data = mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~class, ncol = 2)
八、画图实践
1、如何用R语言ggplot2画高水平期刊散点图
2、如何用R语言ggplot2画箱线图
3、如何用R语言ggplot2画折线图
待更新