R语言基础| 可视化初探(ggplot2)

写在前面

ggplot2 是一个基于 R 语言的数据可视化包,提供了一种结构化的方法来描述和构建图表,因此被广泛用于制作可视化图表。其是tidyverse数据科学生态系统的一部分。

在 ggplot2 中,每一个图形都是从数据映射到美学属性(如颜色、形状和大小)、加上几何对象(如点、线和条形图)、统计变换和坐标系等元素组合而成。这种分层和模块化的方法使得用户可以灵活地创建复杂的图表,同时保持代码的可读性和易用性。通过ggplot2,你可以创建各种图表:包括但不限于散点图、线图、直方图、条形图和箱线图。此外,ggplot2 提供了广泛的自定义选项,允许用户调整几乎图表的每个细节,以适应具体的展示需求。

简而言之,ggplot2 是 R 语言中一个功能强大且灵活的数据可视化工具。因此,本文主要学习:如何使用mosaicData包中的CPS85数据框来初步探索ggplot2的基础用法。

4.1 使用ggplot2包创建图形

复制代码
install.packages(c("mosaicData","ggplot2"))

## Warning: 程辑包'mosaicData'是用R版本4.3.2 来建造的

4.1.1 函数ggplot2()

需要2个参数

1)设置数据框,这里为data=CPS85

2)一组映射,是数据框中的变量到图形中的可视属性的映射,放置在函数aes()中,aes()函数表示美化或你能看见的东西

复制代码
ggplot(data=CPS85,mapping = aes(x=exper,y=wage))

这里的图是空白的,是因为我们还未指定要放置什么在图上,仅指定来exper(工作年限)映射到x轴,wage(工资)映射到y

4.1.2 geom()函数

4.1.2.1 函数选项

该函数是规定在图形上放置什么样的几何对象(点、线、条、阴影区域),常用选项为:

函数 添加的图形 选项
geom_bar() 条形图 color,fill,alpha
geom_boxplot() 箱线图 color,fill,alpha,notch,width
geom_density() 核密度图 color,fill,alpha,linetype
geom_histogram() 直方图 color,fill,alpha,linetype,binwidth
geom_hline() 水平线条 color,alpha,linetype,size
geom_jitter() 抖动点 color,size,alpha,shape
geom_line() 线图 colorvalpha,linetype,size
geom_piont() 散点图 color,alpha,shape,size
geom_rug() 地毯图 color,side
geom_smooth() 拟合曲线 method,formula,color,fill,linetype,size
geom_text() 文本注解 选项很多,详见帮助信息
geom_violin() 小提琴图 color,fill,alpha,lintype
geom_vline() 垂线 color,alpha,linetype,size

注解

color表示颜色,可以用名称或十六进制代码指定,几何图形外框颜色

alpha表示透明度,0(完全透明)-1(完全不透明)

fill表示几何图形填充颜色

4.1.2.2 举例

对刚刚的数据(工作年限和工资)做散点图,用geom_piont()

复制代码
library(ggplot2)
library(mosaicData)
ggplot(data = CPS85,mapping = aes(x=exper,y=wage))+
  geom_point()

图片中显示出一个异常值,可以对其删除后再做图:

复制代码
CPS85 <- CPS85[CPS85$wage<40,]
ggplot(data = CPS85,mapping = aes(x=exper,y=wage))+
  geom_point()

利用geom_piont()函数的选项进行细节设置:

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage))+
  geom_point(color="blue",alpha=0.5,size=1.5)+
  theme_bw()

theme_bw()函数将灰色背景变为白色

利用geom_smooth()函数在图片中添加一条趋势线,geom_smooth将在11章详细说:

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage))+
  geom_point(color="blue",alpha=0.5,size=1.5)+
  geom_smooth(method = "lm")+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

注意,lm是字母l,不是数字1

4.1.3 分组

将变量值映射到颜色、形状、大小、透明度、线条样式和几何对象的其它视觉特征,使得多组观测值在单个图形中叠加,这一过程称为分组。例如,我们添加sex变量,并用color,shape和linetype表示该变量。

复制代码
head(CPS85)

##   wage educ race sex hispanic south married exper union age   sector
## 1  9.0   10    W   M       NH    NS Married    27   Not  43    const
## 2  5.5   12    W   M       NH    NS Married    20   Not  38    sales
## 3  3.8   12    W   F       NH    NS  Single     4   Not  22    sales
## 4 10.5   12    W   F       NH    NS Married    29   Not  47 clerical
## 5 15.0   12    W   M       NH    NS Married    40 Union  58    const
## 6  9.0   16    W   F       NH    NS Married    27   Not  49 clerical

ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(color="blue",alpha=0.5,size=1.5)+
  geom_smooth(method=lm,se=FALSE)+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

该图中的点按性别填充了不同颜色和形状,并做了男女各自的最佳拟合线

该图反映出男性的薪资高于女性,且与工作年限和薪资之间的关系比女性的更紧密(线条更陡)

4.1.4 标尺

标尺是指定每个映射是如何进行的,以**scale_**开始,下面为一些常用标尺:

举例

将x轴范围设置为0-60,每个格子为10;y轴范围设置为0-30,每个格子为5;女性编码为红色,男性为蓝色:

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5,size=1.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5))+
  scale_color_manual(values = c("red","blue"))+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

**seq(0,60,10)**表示可以生成一个数值向量,从0-60,按10递增。

为x或y轴设置labels

例如这里的y轴上的单位是美元,我们可以使用scales包更改,这个包提供美元,欧元,百分比等标签格式:

复制代码
install.packages("scales")

library(scales)
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5,size=1.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

除了使用labels = scales::dollar将刻度标签设置为货币格式之外,scale_y_continuous()函数还可以接受其他参数来设置刻度标签的格式。下面是一些常见的选项:

scales::comma:将刻度标签设置为千位分隔符格式,例如 1,000。

scales::percent:将刻度标签设置为百分比格式,例如 50%。

scales::scientific:将刻度标签设置为科学计数法格式,例如 1e+03。

scales::dollar_format(prefix = "", suffix =""):将刻度标签设置为带有自定义前缀和后缀的货币格式。你可以通过设置prefix参数和suffix参数来指定前缀和后缀的文本。

4.1.5 刻面

下一个问题是:对于每个职业来说,工资年薪、薪资和性别之间的关系又具体如何?刻面可以帮我们解决这一问题

刻面为给定的某个变量(或变量组合)的每一个水平分别绘制一张图。

语法:

var,colvar,rowvar表示因子。

例如,在本数据框中,研究不同职业的工资年薪、薪资和性别三者之间的关系:

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  facet_wrap(~sector)+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

这里我们未设置size,由于大图变成8张小图,因此我们不手动设置,使其自动设置较为好看的结果图。

结果显示了每种职业的工资年薪、薪资和性别三者之间的关系

试试其他的写法与输出的格式- facet_wrap(~var,ncol=n):输出单行

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  facet_wrap(~sector,ncol = 4)+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

facet_grid(.~colvar):输出单行

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  facet_grid(.~sector)+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

facet_grid(rowvar~.):输出单列

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  facet_grid(sector~.)+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

4.1.6 标签

labs()函数为坐标轴和图例提供了自定义标签。可以自行添加主标题、副标题和说明文字。

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  facet_wrap(~sector,ncol = 4)+
  labs(title = "Relationship between wages and experience",subtitle = "Current Population Survey",
       x="Years of Experience",
       y="Hourly wage")+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

4.1.7主题

theme_ 主题可以控制背景、颜色、字体、网格线、图例位置、及其他与数据无关的图形特征。前面用到的theme_bw()就是将背景颜色设置为白色,这里我们展示一个简约主题(theme_minimal()):

复制代码
ggplot(data = CPS85,mapping = aes(x=exper,y=wage,color=sex,shape=sex,linetype=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE)+
  scale_x_continuous(breaks = seq(0,60,10))+
  scale_y_continuous(breaks = seq(0,30,5),
                     labels = scales::dollar)+
  scale_color_manual(values = c("red","blue"))+
  facet_wrap(~sector,ncol = 4)+
  labs(title = "Relationship between wages and experience",subtitle = "Current Population Survey",
       x="Years of Experience",
       y="Hourly wage")+
  theme_minimal()

## `geom_smooth()` using formula = 'y ~ x'

4.2 ggplot2包的详细信息

4.2.1 放置数据和映射选项

我们来看两个图片的区别和代码的区别:

复制代码
ggplot(CPS85,aes(x=exper,y=wage,color=sex))+
  geom_point(alpha=0.5)+
  geom_smooth(method="lm",se=FALSE,size=1)+
  scale_color_manual(values = c("red","blue"))+
  theme_bw()

## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

## `geom_smooth()` using formula = 'y ~ x'
复制代码
ggplot(CPS85,aes(x=exper,y=wage))+
  geom_point(aes(color=sex,alpha=0.5))+
  geom_smooth(method="lm",se=FALSE,size=1)+
  scale_color_manual(values = c("red","blue"))+
  theme_bw()

## `geom_smooth()` using formula = 'y ~ x'

在1中,由于性别到颜色的映射出现在函数ggplot中,因此该映射也会应用到geom_piont和geom_smooth中,从而geom_piont中点的颜色表示性别,geom_smooth中生成分别男女的各自趋势线;

而在2中,性别到颜色的映射只出现在函数geom_piont中,因此仅能在此处使用,对geom_smooth则没有该映射,因此只出现一条针对所有数值的趋势线。

由于大部分数据是在ggplot函数中放置数据和映射,因此第一个选项总是引用数据,第二个选项总是引用映射,故用省略短语data=和mapping=

4.2.2 将图形作为对象使用

将图形作为对象的功能可以让我们继续操作并修改这些图形,例如:

复制代码
myplot <- ggplot(CPS85,aes(x=exper,y=wage))+
  geom_point()
myplot
复制代码
myplot2 <- myplot+geom_point(size=3,color="blue")+
  geom_smooth()
myplot2

## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

4.2.3 保存图形

1)直接在viewer中点击处理

2)**ggsave()**函数

复制代码
ggsave(file="mygragh.png",plot = myplot,width = 5,height = 4)

这里的file=是设置图片名和格式,plot=是针对哪张图保存,宽度和高度单位是英寸

图片格式有以下几种:pdf,jpeg,tiff,png,svg,wmf

其中pdf,svg,wmf格式为向量格式,不会出现图片模糊或者有锯齿的情况,用于网页的格式是png格式,microsoft word或者powerpoint文档中显示的图片通常用wmf格式,但是wmf文件会丢失已经指定的透明度设置。

完整教程请查看

R语言基础学习手册

相关推荐
lishaoan777 小时前
实验设计与分析(第6版,Montgomery)第4章随机化区组,拉丁方, 及有关设计4.5节思考题4.26~4.27 R语言解题
r语言·统计分析·方差分析·实验设计与分析·正交拉丁方
南瓜胖胖7 小时前
【R语言编程绘图-函数篇】
开发语言·r语言
lishaoan771 天前
实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.6 R语言解题
r语言·统计分析·实验设计与分析·残差分析·单因子方差分析·正态性假设·tukeyhsd
南瓜胖胖1 天前
【R语言编程绘图-折线图】
开发语言·r语言
Chef_Chen1 天前
从0开始学习R语言--Day11--主成分分析
开发语言·学习·r语言
开开心心就好2 天前
安卓实用复制功能增强工具
开发语言·javascript·python·qt·r语言·ocr·pygame
Chef_Chen2 天前
从0开始学习R语言--Day09--方差分析
开发语言·学习·r语言
开开心心就好2 天前
识别速度快且精准的OCR工具
开发语言·javascript·qt·r语言·ecmascript·ocr·bash
胖哥真不错2 天前
R基于逻辑回归模型实现心脏病检测及SHAP值解释项目实战
r语言·逻辑回归·项目实战·shap值解释·逻辑回归模型·心脏病检测