【R语言】绘图

一、散点图

散点图也叫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.xaxis.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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能(AI)的不同维度分类

人工智能(AI)的分类 对机器学习进行分类的方式多种多样&#xff0c;可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的&#xff1a; 1、按数据模态不同:图像&#xff0c;文本&#xff0c;语音&#xff0c;多态等 2、按目标函数不同:判别式模型…

Java 大视界 -- Java 大数据未来十年的技术蓝图与发展愿景(95)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

【网络安全 | 漏洞挖掘】账户接管+PII+原漏洞绕过

文章目录 前言正文前言 本文涉及的所有漏洞测试共耗时约三周,成果如下: 访问管理面板,成功接管目标列出的3000多家公司。 获取所有员工的真实指纹、机密文件及个人身份信息(PII)。 绕过KYC认证,成功接管电话号码。 绕过此前发现的漏洞。 正文 在测试目标时,我发现了一…

MySQL的Union和OR查询

这里写目录标题 **1. 创建表和索引****2. 编写 UNION 查询****3. 使用 EXPLAIN 分析查询****4. 分析 EXPLAIN 结果****可能的结果分析**&#xff1a; **5. 验证索引合并****总结****1. UNION 操作的分析****为什么使用临时表&#xff1f;** 2. OR 条件的分析为什么使用索引合并…

二叉排序树 -- AVL树 红黑树

手撕 – AVL树、红黑树 个人主页&#xff1a;顾漂亮 文章专栏&#xff1a;Java数据结构 文章目录 手撕 -- AVL树、红黑树1.AVL树1.1AVL树的概念1.2AVL树的性质1.3AVL树的实现 -- Java代码1.4AVL树的性能分析 2.红黑树2.1概念2.2红黑树的性质2.3红黑树的实现2.4AVL树和红黑树的比…

在 .NET 8/9 中使用 AppUser 进行 JWT 令牌身份验证

文章目录 一、引言二、什么是 JSON Web 令牌&#xff1f;三、什么是 JSON Web 令牌结构&#xff1f;四、设置 JWT 令牌身份验证4.1 创建新的 .NET 8 Web API 项目4.2 安装所需的 NuGet 软件包4.3 创建 JWT 配置模型4.4 将 JWT 配置添加到您的 appsettings.json 中4.5 为 Config…

问卷数据分析|SPSS实操之相关分析

皮尔逊还是斯皮尔曼的选取主要看数据的分布 当数据满足正态分布且具有线性关系时&#xff0c;用皮尔逊相关系数 当有一个不满住时&#xff0c;用斯皮尔曼相关系数 1. 选择分析--相关--双变量 2. 将Z1-Y2加入到变量中&#xff0c;选择皮尔逊 3. 此处为结果&#xff0c;可看我案…

自动化办公|xlwings生成图表

在日常的数据分析和报告生成中&#xff0c;Excel图表是一个非常重要的工具。它能够帮助我们直观地展示数据&#xff0c;发现数据中的规律和趋势。然而&#xff0c;手动创建和调整图表往往耗时且容易出错。幸运的是&#xff0c;借助Python的xlwings库&#xff0c;我们可以自动化…

Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互

Node.js环境安装 sodium-native (其他库可能会出现加密解密失败&#xff0c;如果要使用不一样的库&#xff0c;请自行验证) npm install sodium-native 示例代码&#xff0c;使用的是 sodium-native v4.3.2 (其他版本可能会有变化&#xff0c;如果要使用&#xff0c;请自行验…

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现&#xff1a; Makefile task.h task.cpp Initchannel函数&#xff1a; 创建任务&#xff1a; 控制子进程&#xff1a; 子进程执行任务&#xff1a; 清理收尾&#xff1a; 三、全部代码&#xff1a; 前言&#xff1a; 对于管…

使用LangChain构建第一个ReAct Agent

使用LangChain构建第一个ReAct Agent 准备环境 使用Anaconda 安装python 3.10 安装langchain、langchain_openai、langchain_community &#xff08;安装命令 pip install XXX&#xff09; 申请DeepSeek API&#xff1a;https://platform.deepseek.com/api_keys&#xff08;也…

多人协同创作gitea

多人协同创作gitea 在多台设备上协同使用Gitea&#xff0c;主要是通过网络访问Gitea服务器上的仓库来进行代码管理和协作。以下是一些关键步骤和建议&#xff0c;帮助你在多台设备上高效地使用Gitea进行协作&#xff1a; 1. 确保Gitea服务可访问 首先&#xff0c;你需要确保…

【个人开源】——从零开始在高通手机上部署sd(二)

代码&#xff1a;https://github.com/chenjun2hao/qualcomm.ai 推理耗时统计 单位/ms 硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae骁龙8 gen124716.994133440.39723.215411.097696.327 1. 下载依赖 下载opencv_x64.tar,提取码: rrbp下载opencv_aarch64.t…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

学习经验分享【39】YOLOv12——2025 年 2 月 19 日发布的以注意力为核心的实时目标检测器

YOLO算法更新速度很快&#xff0c;已经出到V12版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 代码&#xff1a;GitHub - sunsmarterjie/yolov12: YOLOv12: Attention-Centric Real-Time Object Detectors 摘要&#xff1a;长期以来&#xff0c;增强 …

Pytorch实现之特征损失与残差结构稳定GAN训练,并训练自己的数据集

简介 简介:生成器和鉴别器分别采用了4个新颖设计的残差结构实现,同时在损失中结合了鉴别器层的特征损失来提高模型性能。 论文题目:Image Generation by Residual Block Based Generative Adversarial Networks(基于残留块的生成对抗网络产生图像) 会议:2022 IEEE Int…

后“智驾平权”时代,谁为安全冗余和体验升级“买单”

线控底盘&#xff0c;正在成为新势力争夺下一个技术普及红利的新赛点。 尤其是进入2025年&#xff0c;比亚迪、长安等一线传统自主品牌率先开启高阶智驾的普及战&#xff0c;加上此前已经普及的智能座舱&#xff0c;舱驾智能的「科技平权」进一步加速行业启动「线控底盘」上车窗…

【Node.js】express框架

目录 1初识express框架 2 初步使用 2.1 安装 2.2 创建基本的Web服务器 2.3 监听方法 2.3.1 监听get请求 2.3.2 监听post请求 2.4 响应客户端 2.5 获取url中的参数(get) 2.5.1 获取查询参数 2.5.2 获取动态参数 2.6 托管静态资源 2.6.1 挂载路径前缀 2.6.2 托管多…

树形DP(树形背包+换根DP)

树形DP 没有上司的舞会 家常便饭了&#xff0c;写了好几遍&#xff0c;没啥好说的&#xff0c;正常独立集问题。 int head[B]; int cnt; struct node {int v,nxt; }e[B<<1]; void modify(int u,int v) {e[cnt].nxthead[u];e[cnt].vv;head[u]cnt; } int a[B]; int f[B]…

REACT--组件通信

组件之间如何进行通信&#xff1f; 组件通信 组件的通信主要借助props传递值 分为整体接收、解构接收 整体接收 import PropTypes from prop-types;//子组件 function Welcome(props){return (<div>hello Welcome,{props.count},{props.msg}</div>) }// 对 We…