一、散点图
散点图也叫X-Y图,它将所有的数据以点的形式展现在坐标系上,用来显示变量之间的相互影响程度。
ggplot2包中用来绘制散点图的函数是geom_point(),但在绘制前需要先用ggplot()函数指定数据集和变量。
下面用mtcars数据集做演示,绘制mpg与wt之间的关系。
1、生成散点图
head(mtcars)
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) + # 映射x和y变量
geom_point() + # 添加散点图层
labs(title = "汽车重量与油耗之间的关系", # 标题和轴标签
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal() # 设置主题
2、设置形状和颜色
可以通过geom_point()函数的shape参数和col参数改变点的形状和颜色。
ggplot() +
geom_point(data=mtcars, aes(x = wt, y = mpg), shape=2, col="red") +
labs(title = "汽车重量与油耗之间的关系", # 标题和轴标签
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal() # 设置主题
当shape为2时,点的颜色只能由col参数控制。但对于一些类型的点,比如shape=24,还可以使用fill参数填充颜色。
ggplot() +
geom_point(data=mtcars, aes(x = wt, y = mpg), shape=24, col="red", fill="green") +
labs(title = "汽车重量与油耗之间的关系", # 标题和轴标签
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal() # 设置主题
3、拟合回归线
可以使用stat_smooth()函数拟合回归线,通过其参数method拟合直线(lm),或拟合平滑曲线(loess)。
# 拟合一条直线
ggplot(mtcars, aes(x = wt, y = mpg)) + # 映射x和y变量
geom_point() +
stat_smooth(method="lm", level=0.95) +
labs(title = "汽车重量与油耗之间的关系", # 标题和轴标签
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal()
# 拟合一条平滑曲线
ggplot(mtcars, aes(x = wt, y = mpg)) + # 映射x和y变量
geom_point() +
stat_smooth(method="loess", level=0.95) +
labs(title = "汽车重量与油耗之间的关系", # 标题和轴标签
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal()
4、设置分组
很多时候需要先对数据进行分组,然后再绘制散点图。设置分组的依据有很多,比如散点形状、颜色、填充色等。
以形状进行分组:
# 因为am变量是离散数据,所以需要先将其转换为因子
mtcars1 <- mtcars
mtcars1$am <- factor(mtcars$am)
# 将am变量映射给形状
ggplot(mtcars1, aes(x=wt, y=mpg,shape=am)) +
geom_point() +
labs(title = "汽车重量与油耗之间的关系",
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal()
以形状为分组,并添加线性回归直线:
# 因为am变量是离散数据,所以需要先将其转换为因子
mtcars1 <- mtcars
mtcars1$am <- factor(mtcars$am)
# 将am变量映射给形状
ggplot(mtcars1, aes(x=wt, y=mpg, shape=am)) +
geom_point() +
stat_smooth(method="lm", level=0.95) +
labs(title = "汽车重量与油耗之间的关系",
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal()
用颜色进行分组:
# 因为am变量是离散数据,所以需要先将其转换为因子
mtcars1 <- mtcars
mtcars1$am <- factor(mtcars$am)
# 将am变量映射给形状
ggplot(mtcars1, aes(x=wt, y=mpg, col=am)) +
geom_point() +
labs(title = "汽车重量与油耗之间的关系",
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal()
以颜色为分组,并添加线性回归直线:
# 因为am变量是离散数据,所以需要先将其转换为因子
mtcars1 <- mtcars
mtcars1$am <- factor(mtcars$am)
# 将am变量映射给形状
ggplot(mtcars1, aes(x=wt, y=mpg, col=am)) +
geom_point() +
stat_smooth(method="lm", level=0.95) +
labs(title = "汽车重量与油耗之间的关系",
x = "重量(吨)",
y = "每加仑英里数(MPG)") +
theme_minimal()
5、生成单变量散点图
可以使用R语言内置的stripchart()函数生成单变量散点图。
# 设置随机种子
set.seed(100)
# 生成10个随机数并重复10次
x <- rep(round(rnorm(10,0,1), digits=2), 10)
# 生成单变量散点图
stripchart(x)
# 可以添加上下扰动
stripchart(x, method="jitter")
二、折线图
折线图的实现方法是使用geom_line()函数。
1、简单折线图
head(mtcars)
library(dplyr)
data1 <- mtcars %>% group_by(carb) %>% summarize_at(.vars="mpg", .funs=mean)
# 绘制简单折线图
ggplot(data1, aes(x=carb, y=mpg)) + geom_line()
2、离散数据
对折线图来说,x轴对应的变量可以是离散型数据(包括因子),也可以是连续型数据。但如果是前者的话,必须使用aes(group=1)命令,否则程序将无法确定这些点是否属于同一个组。
当x轴变量为离散数据但未指定aes(group=1)时,将无法画出正确的图:
data2 <- mtcars %>% group_by(carb) %>% summarize_at(.vars="mpg", .funs=mean) %>% mutate(carb=as.character(carb))
# 当x轴变量为离散数据但未指定aes(group=1)时,将无法画出正确的图
ggplot(data2, aes(x=carb, y=mpg)) + geom_line()
指定aes(group=1),绘制x变量为离散型数据时的折线图
# 绘制x变量为离散型数据时的折线图
ggplot(data2, aes(x=carb, y=mpg, group=1)) + geom_line() + geom_point(shape=22,size=2)
3、多重折线图
如果分组变量有两个,这时绘制的折线图叫多重折线图。有多种方法可以进行处理,比如将另一个变量映射给线形或者线条颜色。
data3 <- mtcars %>% group_by(am, cyl) %>% summarize_at(.vars="mpg",.funs=mean) %>% ungroup() %>% mutate(am=as.character(am))
# 保留变量cy1,将am变量映射给线形
ggplot(data3, aes(x=cyl, y=mpg, linetype=am)) + geom_line()
# 将am映射给线条颜色
ggplot(data3, aes(x=cyl, y=mpg, color=am)) + geom_line()
三、条形图
条形图(Bar Plot)是一种常用的数据可视化工具,用于展示分类变量的频数、比例或其他统计量。R 提供了多种函数来创建条形图,最常用的是barplot() 函数和ggplot2包中的geom_bar()函数。
1、单变量
library(ggplot2)
# 准备数据
data <- data.frame(
Category = c("A", "B", "C", "D", "E"),
Value = c(89, 178, 105, 125, 100)
)
# 创建条形图
ggplot(data, aes(x = Category, y = Value)) +
geom_bar(stat = "identity", fill = "skyblue", color = "darkblue") + # 绘制条形图
labs(title = "条形图", x = "类别", y = "值") + # 设置标题和轴标签
theme_minimal() # 使用简洁的主题
参数详解:
aes(x=Category, y=value):指定 x 轴和 y 轴的变量。
geom_bar(stat="identity"):绘制条形图,stat="identity" 表示直接使用数据中的值。
fill:条形的填充颜色。
color:条形的边框颜色。
labs():设置标题和轴标签。
theme_minimal():使用简洁的主题风格。
2、多变量
如果变量有多个,可以使用分组条形图或者堆积条形图。
分组条形图需要将第2个自变量映射到fill中(也可以是color),然后将geom_bar()函数的position参数设置为dodge。
2.1 分组条形图
# 创建示例数据
data <- data.frame(
Category = c("A", "B", "C", "A", "B", "C"),
Group = c("Group1", "Group1", "Group1", "Group2", "Group2", "Group2"),
Value = c(10, 20, 15, 12, 22, 18)
)
ggplot(data, aes(x = Category, y = Value, fill = Group)) +
geom_bar(stat = "identity", position = "dodge") + # 使用 position = "dodge" 分组显示
labs(title = "分组条形图", x = "类别", y = "值", fill = "组别") + # 设置标题和标签
theme_minimal()
2.2 堆积条形图
# 绘制堆积条形图
ggplot(data, aes(x = Category, y = Value, fill = Group)) +
geom_bar(stat = "identity", position = "stack") + # 使用 position = "stack" 堆叠显示
labs(title = "堆积条形图", x = "类别", y = "值", fill = "组别") + # 设置标题和标签
theme_minimal()
2.3 百分比堆积条形图
它是将所有堆积条形的高度设置为一样。
library(ggplot2)
library(dplyr)
data <- data.frame(
Category = c("A", "B", "C", "A", "B", "C"),
Group = c("Group1", "Group1", "Group1", "Group2", "Group2", "Group2"),
Value = c(10, 20, 15, 12, 22, 18)
)
# 计算百分比
data <- data %>%
group_by(Category) %>%
mutate(Percentage = Value / sum(Value) * 100)
# 绘制百分比堆积条形图
ggplot(data, aes(x = Category, y = Percentage, fill = Group)) +
geom_bar(stat = "identity", position = "stack") +
geom_text(aes(label = paste0(round(Percentage, 1), "%")), # 添加百分比标签
position = position_stack(vjust = 0.5), color = "white", size = 4) +
scale_fill_manual(values = c("Group1" = "skyblue", "Group2" = "orange")) + # 自定义颜色
labs(title = "百分比堆积条形图", x = "类别", y = "百分比 (%)", fill = "组别") +
theme_minimal()
四、饼图
用ggplot2绘制饼图时,绘制出条形图是第一步,然后再通过极坐标函数coord_polar()画出饼图。
sales <- c(350000, 250000, 150000, 100000, 50000)
departments <- c("产品部", "市场部", "研发部", "财务部", "行政部")
# 创建数据框
df <- data.frame(
部门 = departments,
销售额 = sales
) %>%
mutate(占比 = 销售额 / sum(销售额)) # 计算比例
# 绘制饼图
ggplot(df, aes(x = "", y = 占比, fill = 部门)) +
geom_bar(stat = "identity", width = 1) + # 柱状图形式
coord_polar(theta = "y") + # 转换为极坐标系
scale_y_continuous(labels = scales::percent) + # 显示百分比
labs(title = "部门销售额占比分析",
fill = "部门") +
theme_minimal()
还可以绘制3D饼图,需要使用plotrix扩展包中的pie3D()函数。(在安装plotrix包时报错)
library(plotrix)
sales <- c(350000, 250000, 150000, 100000, 50000)
departments <- c("产品部", "市场部", "研发部", "财务部", "行政部")
pie3d(sales, labels = departments, main = "3D饼图示例", explode = 0.1)
但饼图有一些不被统计学家所接受的缺点,其中之一就是不能很好地区分差异较小的数据。对此,可以使用扇形图,plotrix扩展包中的fan.plot()函数可以用来绘制扇形图。
五、箱线图
箱线图(Boxplot),又称盒须图、箱形图,它是一种用于显示数据分布情况的图表,可以直观地展示数据的中心趋势、分散程度以及异常值。它主要用于反映单组原始数据分布的特征,还可以进行多组数据分布特征的比较。优点是可以展示大批量数据的分布特征。
它主要是利用5个点来绘制:第25百分位数、第50百分位数(中位数)、第75百分位数及两端的边缘值。
可以使用基础R中的boxplot()函数来创建箱线图,也可以使用ggplot2包中的geom_boxplot()函数来创建更复杂、更丰富的箱线图。
下面使用nlme包中的MathAchieve数据集做演示,此数据集中有超过7000条数据,包括学校(School)、少数民族(Minority)、性别(Sex)、社会经济地位指数(SES)、数学成就测验成绩(MathAch)以及学校平均社会经济地位指数(MEANSES)。
1、单组箱线图
library(nlme)
library(ggplot2)
# 绘制简单箱线图
ggplot(MathAchieve, aes(x=0, y=MathAch)) + geom_boxplot(width=0.5) +
xlim(-1, 1) + theme(axis.text.x=element_blank(), axis.title.x=element_blank())
5个点的位置如下图所示。
需要注意的是在使用geom_boxplot()函数绘制箱线图的时候,边缘值默认是通过1.5倍四分位差决定的,但当上边缘值大于最大值,下边缘值小于最小值时,两端的线就只会延伸到最大值和最小值。
xlim()函数将x轴的范围设置为-1~1,将其宽度width设为0.5,让箱子的宽度更协调,通过axis.text.x和axis.title.x参数将x轴的刻度线和标签移除掉。
2、多组箱线图
实际应用中,箱线图多用于展示多组数据,比较各组之间的分布特征。
head(MathAchieve)
data1 <- MathAchieve
data1$SES1 <- cut(data1$SES, breaks=c(min(data1$SES),-1,0,1,max(data1$SES)),
labels = c("SES(<-1)", "SES(-1~0)", "SES(0~1)", "SES(>1)"),
include.lowest=T, right=T)
# 绘制多组箱线图
ggplot(data1, aes(x=SES1, y=MathAch, fill=SES1)) + geom_boxplot()
有时候为了让箱线图中各组的平均数(第50百分位数)更容易比较,可以向象限图中加入槽口,通过geom_boxplot函数中的motch=TRUE实现;添加平均值通过stat_summary()函数实现;移除图例可以通过将show.legend设为FALSE实现。
ggplot(data1, aes(x=SES1, y=MathAch, fill=SES1)) +
geom_boxplot(notch=T, show.legend=FALSE)+
stat_summary(fun.y="mean", geom="point", shape=15, size=2, color="blue", show.legend=F)
六、直方图
直方图可更多地反映数据分布的细节。
ggplot2包中绘制直方图的函数是geom_histogram()。