【R语言】绘图

一、散点图

散点图也叫X-Y图,它将所有的数据以点的形式展现在坐标系上,用来显示变量之间的相互影响程度。

ggplot2包中用来绘制散点图的函数是geom_point(),但在绘制前需要先用ggplot()函数指定数据集和变量。

下面用mtcars数据集做演示,绘制mpg与wt之间的关系。

1、生成散点图

R 复制代码
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参数改变点的形状和颜色。

R 复制代码
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参数填充颜色。

R 复制代码
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)++。

R 复制代码
# 拟合一条直线
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()   
R 复制代码
# 拟合一条平滑曲线
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、设置分组

很多时候需要先对数据进行分组,然后再绘制散点图。设置分组的依据有很多,比如散点形状、颜色、填充色等。

形状进行分组:

R 复制代码
# 因为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() 

形状为分组,并添加线性回归直线:

R 复制代码
# 因为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() 

颜色进行分组:

R 复制代码
# 因为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() 

颜色为分组,并添加线性回归直线:

R 复制代码
# 因为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()函数生成单变量散点图。

R 复制代码
# 设置随机种子
set.seed(100)
# 生成10个随机数并重复10次
x <- rep(round(rnorm(10,0,1), digits=2), 10)
# 生成单变量散点图
stripchart(x)
R 复制代码
# 可以添加上下扰动
stripchart(x, method="jitter")

二、折线图

折线图的实现方法是使用geom_line()函数

1、简单折线图

R 复制代码
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)时,将无法画出正确的图:

R 复制代码
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变量为离散型数据时的折线图

R 复制代码
# 绘制x变量为离散型数据时的折线图
ggplot(data2, aes(x=carb, y=mpg, group=1)) + geom_line() + geom_point(shape=22,size=2)

3、多重折线图

如果分组变量有两个,这时绘制的折线图叫多重折线图。有多种方法可以进行处理,比如将另一个变量映射给线形或者线条颜色。

R 复制代码
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()
R 复制代码
# 将am映射给线条颜色
ggplot(data3, aes(x=cyl, y=mpg, color=am)) + geom_line()

三、条形图

条形图(Bar Plot)是一种常用的数据可视化工具,用于展示分类变量的频数、比例或其他统计量。R 提供了多种函数来创建条形图,最常用的是barplot() 函数和ggplot2包中的geom_bar()函数。

1、单变量

R 复制代码
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 分组条形图

R 复制代码
# 创建示例数据
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 堆积条形图

R 复制代码
# 绘制堆积条形图
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 百分比堆积条形图

它是将所有堆积条形的高度设置为一样。

R 复制代码
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()**画出饼图。

R 复制代码
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包时报错)

R 复制代码
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、单组箱线图

R 复制代码
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.xaxis.title.x参数将x轴的刻度线和标签移除掉。

2、多组箱线图

实际应用中,箱线图多用于展示多组数据,比较各组之间的分布特征。

R 复制代码
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实现。

R 复制代码
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();绘制核密度图的函数为geom_histogram()和geom_line()(这两个函数的区别在于,前者绘制出来的图形是封闭的,而后者不是。)

下面仍然用nlme包中的MathAchieve数据集做演示。

1、简单直方图

R 复制代码
library(nlme)
library(ggplot2)
head(MathAchieve)
# 绘制学生的数学成就测验成绩直方图
ggplot(data=NULL, aes(x=MathAchieve$MathAch)) + 
         geom_histogram(bins=20, col="green", fill="yellow")

bins参数表示显示20个直方。

2、核密度曲线

通过使用geom_line()函数 实现,设置stat=density

R 复制代码
ggplot(MathAchieve, aes(x=MathAch, color=Sex)) + geom_line(stat="density")

3、直方图+核密度曲线

实际使用中,直方图经常和核密度图结合使用,这样可以更好地看出数据的分布形态。

核密度图是++基于样本数据对总体分布的一个估计++ 。在直方图上添加核密度曲线时,由于两者y轴坐标的不一致,故需要设置y=..density..,将直方图的标度与核密度曲线的标度相匹配。

R 复制代码
# 在上面所示的直方图上添加核密度曲线
ggplot(MathAchieve, aes(x=MathAch, y=..density..)) + 
        geom_histogram(bins=20, col="green", fill="yellow", size=0.2) + 
        geom_density(size=1) + xlim(-10,30)

七、多变量绘图

多变量绘图是指涉及到3个或3个以上的变量。

1、气泡图

气泡图是一种在二维坐标系上展示3个变量的统计图,它实际上是一种特殊的二维散点图,是用第3个变量的大小用点来表示。

它是用两个主要的两个变量作为x轴和y轴,用相对次要的变量来控制气泡的大小。

ggplot2 中绘制气泡图时只需要将第3个变量映射给size参数即可。

相关推荐
+7202 分钟前
Java 的 HttpClient 中使用 POST 请求传递参数
java·开发语言
@大迁世界1 小时前
构建 Next.js 应用时的安全保障与风险防范措施
开发语言·前端·javascript·安全·ecmascript
水瓶丫头站住2 小时前
Qt中QRadioButton的样式设置
开发语言·qt
魔道不误砍柴功3 小时前
Java中的Stream API:从入门到实战
java·windows·python
xinghuitunan3 小时前
时间转换(acwing)c/c++/java/python
java·c语言·c++·python
tekin3 小时前
Python 高级数据结构操作全解析:从理论到实践
数据结构·python·集合set·高级数据结构·集合操作·队列操作·堆操作
m0_748248024 小时前
爬虫自动化(DrissionPage)
爬虫·python·自动化