写在前面
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文件会丢失已经指定的透明度设置。
完整教程请查看