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语言基础学习手册

相关推荐
灰山君6 天前
企业三维可视化怎么选?山海鲸可视化与老子云3D优势对比
大数据·经验分享·数字孪生·可视化·数据可视化·实时大数据
babe小鑫7 天前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
躺柒9 天前
读数据可视化37开发工具
信息可视化·数据挖掘·数据分析·可视化·数据可视化·web应用·应用程序
深兰科技9 天前
深兰科技受邀参与第二届中国(南宁)—东盟人工智能场景应用对接会,深化AI国际合作
人工智能·qt·r语言·scala·symfony·智能机器人·深兰科技
躺柒9 天前
读数据可视化36可视化软件
信息可视化·可视化·数据可视化·科学可视化·医学可视化
赵钰老师10 天前
基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析
python·arcgis·数据分析·r语言
xhload3d10 天前
图扑智慧工厂 | 继电器产线仿真态势管控平台
物联网·低代码·webgl·数字孪生·可视化·智慧工厂·工业互联网·hightopo
躺柒11 天前
读数据可视化35商业智能与金融数据
信息可视化·金融·可视化·数据可视化·商业智能·风险分析
躺柒12 天前
读数据可视化34其他科学与艺术
网络安全·信息可视化·气象学·可视化·数据可视化·气候模型
躺柒13 天前
读数据可视化33生命科学(下)
信息可视化·可视化·数据可视化·医学·临床医学·生命科学