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

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

1、简单直方图

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

ggplot(MathAchieve, aes(x=MathAch, color=Sex)) + geom_line(stat="density")

 3、直方图+核密度曲线

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

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

# 在上面所示的直方图上添加核密度曲线
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参数即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php session数据存储位置选择

PHP session 数据的存储位置可以通过配置文件或者代码来进行设置。默认情况下&#xff0c;session 数据是存储在服务器的文件系统中的。你可以将 session 数据存储在其他地方&#xff0c;例如数据库、缓存等。 基础概念 PHP session默认情况下将数据存储在服务器端的临时文件中…

保姆级! 本地部署DeepSeek-R1大模型 安装Ollama Api 后,Postman本地调用 deepseek

要在Postman中访问Ollama API并调用DeepSeek模型&#xff0c;你需要遵循以下步骤。首先&#xff0c;确保你有一个有效的Ollama服务器实例运行中&#xff0c;并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级&#xff01;使用Ollama本地部署DeepSeek-R1大模型 并java…

Windows桌面系统管理5:Windows 10操作系统注册表

Windows桌面系统管理0&#xff1a;总目录-CSDN博客 Windows桌面系统管理1&#xff1a;计算机硬件组成及组装-CSDN博客 Windows桌面系统管理2&#xff1a;VMware Workstation使用和管理-CSDN博客 Windows桌面系统管理3&#xff1a;Windows 10操作系统部署与使用-CSDN博客 Wi…

臻识相机,华夏相机,芊熠车牌识别相机加密解密

臻识&#xff0c;华夏&#xff0c;芊熠这三种车牌识别相机解密我都试过了&#xff0c;可以正常解密成功&#xff0c;其它品牌我暂时没有测试。超级简单&#xff0c;免费的&#xff0c;白嫖无敌&#xff01; 流程&#xff1a; ①&#xff1a;先导出配置文件&#xff0c;例如我以…

RK Android11 WiFi模组 AIC8800 驱动移植流程

RK Android WiFi模组 AIC8800 驱动移植流程 作者&#xff1a;Witheart更新时间&#xff1a;20250220 概要&#xff1a;本文介绍了基于 AIC8800D40 芯片的 WiFi6 模组 BL-M8800DS2-40 在 RK3568 平台上的驱动移植流程。主要涉及环境搭建、驱动代码分析、设备树修改、驱动编译配…

Unity Shader Graph 2D - Procedural程序化图形循环加载进度效果

前言 在游戏中进度加载的效果是一种常见的效果,可以告诉玩家当前游戏处于一个资源加载的状态,这样玩家就能理解游戏不是卡住了或者是出现Bug了,而是正在进行一些数据的处理准备进入下一个场景。 创建一个LineLoading的Shader Graph文件,对应创建一个材质球,然后在…

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题&#xff0c;它呢和我们之前的排座位游戏非常之相似&#xff0c;但是&#xff0c;排座位问题选择行和列是不会改变元素的值的&#xff0c;这道题呢每每选一行都会把这行或者这列清零&#xff0c;所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

Java网络编程封装

系列文章目录 Java知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、封装的目标&#x1f449;二、套接字层封装&#x1f449;壁纸分享&#x1f449;总结 &#x1f449;前言 Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来&#xff0c;提供简洁…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

边缘安全加速(Edge Security Acceleration)

边缘安全加速&#xff08;Edge Security Acceleration&#xff0c;简称ESA&#xff09;是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方&#xff0c;通常是在网络的边缘&#xff0c;而不是将所有流…

SpringBoot+Mybatis-Plus实现动态数据源

目录 一、前言二、代码实现1&#xff09;工程结构2&#xff09;相关依赖3&#xff09;数据源拦截切面4&#xff09;动态数据源切换5&#xff09;核心配置类6&#xff09;使用 三、原理分析1&#xff09;mapper接口注入流程2&#xff09;动态数据源切换执行流程 四、声明式事务导…

进程概念、PCB及进程查看

文章目录 一.进程的概念进程控制块&#xff08;PCB&#xff09; 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序&#xff0c;而程序是存放在磁盘的&#xff0c;cpu要想执行程序的指…

字节火山引擎 DeepSeek 接入本地使用

文章目录 1. 火山引擎 DeepSeek 初体验2. 本地接入 火山引擎 DeepSeek API3. 新建 API KEY4. 直接使用 1. 火山引擎 DeepSeek 初体验 火山引擎官网 : https://www.volcengine.com/product/ark 火山云默认给每个模型赠送 50 万 tokens 推理免费额度 进来就会看到模型广场&#…

基于javaweb的SpringBoot个人博客系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

《操作系统 - 清华大学》8 -4:进程管理:进程控制结构

深度剖析进程控制块&#xff1a;操作系统进程管理的核心关键 在操作系统的复杂体系中&#xff0c;进程控制块&#xff08;PCB&#xff09;是实现高效进程管理的关键所在。接下来&#xff0c;将从多个维度深入剖析进程控制块&#xff0c;帮助更好地理解其在操作系统中的重要作用…

Jupyter里面的manim编程学习

1.Jupyterlab的使用 因为我之前一直都是使用的vscode进行manim编程的&#xff0c;但是今天看的这个教程使用的是Jupyter&#xff0c;我也很是好奇这个manim在Jupyter这样的交互式下面会生成怎么样的效果&#xff0c;所以今天尝试了jupyter&#xff0c;并且对于两个进行比较和说…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统&#xff0c;延续了2022年开发的孜然多应用授权系统V2.0 变更&#xff1a;多应用变单系统&#xff0c;去除没用的垃圾代码&#xff0c;从0开发&#xff0c;去除了一些没用的功能 完善了开发文档&#xff0c;之前那套是我写着玩的屎山代码&#xff0c;V1.0将展…

输入菜单关键字,遍历匹配到 menuIds,展开 匹配节点 的所有父节点以及 匹配节点 本身,高亮 匹配节点

菜单检索&#xff0c;名称、地址、权限标志 等 关键字匹配、展开、高亮(全程借助 DeepSeek ) 便捷简洁的企业官网 的后台菜单管理&#xff0c;图示&#xff1a; 改造点&#xff1a; &#xff08;1&#xff09;修改 bootstrapTreeTable 的节点class命名方式为&#xff1a;treeg…

【落羽的落羽 数据结构篇】顺序结构的二叉树——堆

文章目录 一、堆1. 概念与分类2. 结构与性质3. 入堆4. 出堆 二、堆排序三、堆排序的应用——TOP-K问题 一、堆 1. 概念与分类 上一期我们提到&#xff0c;二叉树的实现既可以用顺序结构&#xff0c;也可以用链式结构。本篇我们来学习顺序结构的二叉树&#xff0c;起个新名字—…

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…