面积图是一种数据可视化图表。它通过填充区域来展示数据随某个变量(如时间)的变化趋势及累积效果。面积图能清晰地呈现数据的上升、下降和波动情况,直观反映数据的大小关系。适用于多种领域,如经济数据分析展示 GDP 变化及产业贡献、销售数据分析展示销售趋势及不同产品贡献等。它为理解数据变化和做出决策提供了直观的视觉支持。
0x01 准备工作
安装并加载所需的包:通常使用 ggplot2
包来绘制面积图。如果尚未安装,可以通过 install.packages("ggplot2")
进行安装,然后使用 library(ggplot2)
加载该包。
0x02 准备数据
方便我们演示,这里我们需要使用到R语言的内置数据pressure
以及gcookbook数据集里的uspopage
作为演示,如果没有uspopage
,可以使用install.packages("gcookbook")
进行安装,然后使用library(gcookbook)
加载该数据集。
0x03 绘制基本面积图
使用geom_area()
函数来绘制面积图
#加载ggplot2包
library(ggplot2)
#指定数据和映射关系,并使用geom_area()函数来绘制面积图
ggplot(pressure,aes(x = temperature,y = pressure)) + geom_area()
0x04 美化和调整
1.可以通过设置颜色、填充、设置透明度等参数来美化图形。例如,设置填充颜色以及设置透明度:
#fill = "blue":设置颜色为蓝色
#alpha = 0.3:设置透明度为0.3
ggplot(pressure,aes(x = temperature,y = pressure)) + geom_area(fill = "blue",alpha = 0.3)
2.添加标题和坐标轴标签:
ggplot(pressure,aes(x = temperature,y = pressure)) + geom_area(fill = "blue",alpha = 0.3) +labs(title = "picture") + xlab("温度") + ylab("压强")
3.设置标题居中:
ggplot(pressure,aes(x = temperature,y = pressure)) + geom_area(fill = "blue",alpha = 0.3) +labs(title = "picture") + xlab("温度") + ylab("压强") +theme(plot.title = element_text(hjust = 0.5))
0x05 绘制堆积面积图
由于这里我们需要使用uspopage
这个数据进行演示,所以我们需要加载gcookbook
数据集。
#加载ggplot2包
library(ggplot2)
#加载gcookbook数据集
library(gcookbook)
#将AgeGroup映射到颜色上进行不同的区分
ggplot(uspopage,aes(x = Year,y = Thousands,fill = AgeGroup)) +geom_area(position = "stack")
当使用 position = "stack"
参数时,geom_area()
函数会将不同的数据系列在垂直方向上进行堆积展示。每个数据点的高度是该点对应的所有数据系列值的总和。这样可以直观地看出各个数据系列在总体中的组成部分以及它们随变量变化的情况。
这时候善于学习的小伙伴发现了,没有添加position = "stack"
这个参数时,也能绘制出堆积面积图,那是因为ggplot2
在某些情况下可能会根据数据的结构和所使用的映射(aes)自动推断出合适的图形类型和布局。当使用fill
参数并传入一个分类变量(如AgeGroup
)时,ggplot2
可能会默认将其解释为需要进行堆积展示以区分不同的类别。
同样的道理,当参数设置为position = "identity"
,它有以下特点和用途:
一、功能特点
1.不进行位置调整:与其他位置参数(如 "stack"
)不同,"identity"
不会对几何对象的位置进行特殊的调整。这意味着各个数据点将按照其原始位置进行绘制,不会进行堆积、抖动或其他形式的位置改变。
2.可能出现重叠:如果数据点之间存在重叠,那么使用 "identity"
参数时,这些重叠部分会直接显示出来,而不会进行任何处理以避免重叠。这可能会导致图形中出现部分区域的遮盖或不清晰的情况。
二、应用场景
1.展示数据的原始分布:当你希望准确地展示数据的原始位置和分布情况时,可以使用 "identity"
参数。例如,在绘制散点图或一些需要精确显示每个数据点位置的图形时,这个参数可以确保数据点不会被自动调整位置而改变其原始的空间关系。
2.比较不同数据集的分布:如果需要比较多个数据集在同一坐标系下的分布情况,并且不希望进行位置调整以避免影响对原始分布的观察,那么 "identity"
参数可以帮助你实现这一目的。
0x06 创建分面图
当使用position = "stack
参数时,我们没有办法去比较不同分组之间的差异性,因为它是累加的状态,当使用position = "identity
参数时,我们虽然可以看到它们的大小关系,但这样的一种形式会造成一定的遮挡比较影响美观,所以我们可以使用添加facet_wrap()
函数进行分面展示,这样就可以解决这个问题。
ggplot(uspopage,aes(x = Year,y = Thousands,fill = AgeGroup)) +geom_area(position = "stack",alpha = 0.7 ) +facet_wrap(~AgeGroup)
参数介绍:
1.~var
:指定用于分面的变量。这里的 var
是一个数据框中的变量名,可以是分类变量或离散变量。例如,facet_wrap(~AgeGroup)
将按照 AgeGroup
变量进行分面。
2.nrow
和 ncol
:分别指定分面的行数和列数。如果不指定这两个参数,facet_wrap()
会自动选择一个合适的布局。例如,facet_wrap(~var, nrow = 2, ncol = 3)
将创建一个有 2 行 3 列的分面图。
3.scales
:控制分面之间的坐标轴刻度是否共享。可以设置为 "free"
(每个分面有独立的坐标轴刻度)、"fixed"
(所有分面共享相同的坐标轴刻度)或 "free_x"
(分面在 x 轴上有独立的刻度)、"free_y"
(分面在 y 轴上有独立的刻度)。例如,facet_wrap(~var, scales = "free")
将使每个分面有独立的坐标轴刻度。
0x07 创建分面网格图
同样,我们还可以使用facet_grid()
函数来创建分面网格图,它可以根据两个变量来划分图形为一个网格状的分面布局。与 facet_wrap()
不同,facet_grid()
可以指定行和列的分面变量,从而更精确地控制分面的方式。同时也具备通过将数据按照不同的变量组合进行分面展示,可以更清晰地观察数据在不同条件下的分布和趋势。每个分面都是一个独立的子图,方便进行比较和分析的特点。
ggplot(uspopage,aes(x = Year,y = Thousands,fill = AgeGroup)) +geom_area(position = "stack",alpha = 0.7 ) +facet_grid(.~AgeGroup)
参数介绍:
1.rows
和cols
:用于指定分面的行和列变量。可以是单个变量名或变量名的表达式。例如,facet_grid(rows = ~var1, cols = ~var2)
将根据变量var1
划分行,根据变量var2
划分列。如果只指定一个变量,如facet_grid(cols = ~var)
,则只在列方向上进行分面。可以使用 .
表示不根据某个方向进行分面。例如,facet_grid(. ~ var)
表示只在列方向上根据变量var分面,行方向上不分面。
2.scales
:控制分面之间的坐标轴刻度是否共享。与 facet_wrap()
中的 scales
参数类似,可以设置为 "free"
(每个分面有独立的坐标轴刻度)、"fixed"
(所有分面共享相同的坐标轴刻度)或 "free_x"
(分面在 x 轴上有独立的刻度)、"free_y"
(分面在 y 轴上有独立的刻度)。
3.labeller
:用于自定义分面的标签。可以使用预定义的标签函数,如 label_both()
(同时显示行和列变量的名称)、label_value()
(显示变量的值)等。也可以自定义函数来实现特定的标签格式。
4.margins
:用于指定是否在边缘处添加额外的分面。例如,margins = TRUE
会在边缘处添加一个包含所有变量组合的分面。可以指定单个变量或多个变量的组合,如 margins = "var1"
表示只在变量var1的边缘处添加分面。
5.space
:控制分面之间的空间大小。可以设置为 "fixed"
(所有分面具有相同的空间大小)或 "free"
(根据数据的范围自动调整分面的空间大小)。也可以使用数值来指定具体的空间大小。
6.switch
:控制分面标签的位置。可以设置为 "x"
(将标签放在 x 轴上)、"y"
(将标签放在 y 轴上)或 "both"
(在 x 轴和 y 轴上都显示标签)。