玩转数据可视化之R语言ggplot2


本系列主要介绍R语言ggplot2数据可视化的使用
参考资料:
ggplot2: Elegant Graphics for Data Analysis

文章目录

  • 玩转数据可视化之R语言ggplot2
  • 💘1.ggplot2基础介绍
  • 💔1.1案例数据说明
  • 💕1.2 主要组成部分
  • 💖1.3 颜色、形状、大小和一些其他的美学变量
  • 💗1.4 主要的集合图形绘制
  • ✏️1.4.1 在图形上增加一个平滑曲线
  • ✒️1.4.2 箱线图和抖动点
  • 🖋️1.4.3 直方图和频率多边形
  • 🖊️1.4.4 条形图
  • 🖌️1.4.5 时间序列图和路径图
  • 💙1.5 设置坐标轴
  • 💚1.6 保存图片
  • 💟文章推荐

💘1.ggplot2基础介绍

ggplot2是R语言数据可视化中的重要库之一。本章介绍如何使用ggplot()实现重要的基本图形。

💔1.1案例数据说明

本章中,我们使用ggplot2中的自带数据集mpg

# 导入库
library(ggplot2)
# 如果没有ggplot2库,使用install.packages('ggplot2')
# 查看数据集
head(mpg)

A tibble: 6 × 11

manufacturer

model

displ

year

cyl

trans

drv

cty

hwy

fl

class

<chr>

<chr>

<dbl>

<int>

<int>

<chr>

<chr>

<int>

<int>

<chr>

<chr>

audi

a4

1.8

1999

4

auto(l5)

f

18

29

p

compact

audi

a4

1.8

1999

4

manual(m5)

f

21

29

p

compact

audi

a4

2.0

2008

4

manual(m6)

f

20

31

p

compact

audi

a4

2.0

2008

4

auto(av)

f

21

30

p

compact

audi

a4

2.8

1999

6

auto(l5)

f

16

26

p

compact

audi

a4

2.8

1999

6

manual(m5)

f

18

26

p

compact

各个变量解释如下:

  • cty和hwy分别表示城市和公路每加仑行驶的英里数(mpg)。
  • Dispt是发动机排量,单位为升。
  • drv是动力系统:前轮(f)、后轮(r)或四轮(4)。
  • model是车型。共有38款车型,之所以被选中,是因为它们在1999年至2008年间每年都有一款新版。
  • class是描述汽车“类型”的分类变量:双座、SUV等。

💕1.2 主要组成部分

每个ggplot2绘图都有三个部分:

  • 1.数据,
  • 2.一系列从数据中得到的美学映射
  • 3.至少包含一层要绘图的函数,ggplot2通过层级来不断在图形中增加元素

例如:

ggplot(mpg)+ aes(x = displ, y = hwy)+
    geom_point()

在r语言中graph 在R语言中如何开启GPU_坐标轴

  • 其中数据是mpg
  • aes()是美学映射
  • geom_point是我们要绘图的函数

💖1.3 颜色、形状、大小和一些其他的美学变量

我们可以通过一些参数不断调整我们的图形

  • col表示颜色
  • shape表示形状
  • size表示大小
# 下面我们照样画刚刚那个散点图来演示这些参数如何应用的

ggplot(mpg)+aes(displ,hwy,col=class)+
    geom_point()

在r语言中graph 在R语言中如何开启GPU_数据可视化_02

本例我们将col=class,则会根据class值来给不同类的点给予不同的颜色
如果我们希望设定固定的颜色,则不需要在aes里面设置参数,如下

ggplot(mpg)+aes(displ,hwy)+
    geom_point(col='red')

在r语言中graph 在R语言中如何开启GPU_数据_03

为了让代码可以重用,这里我们定义一个p来接收ggplo对象

p <- ggplot(mpg)
p + geom_point(aes(displ, hwy), col = 'blue')

在r语言中graph 在R语言中如何开启GPU_数据可视化_04

这样可以使代码更简洁,大家可以参考我的R语言数据分析专栏了解更多R语言的使用

💗1.4 主要的集合图形绘制

上述我们使用了geom_point()绘制了散点图,下面介绍一些基础的图形绘制方法。

  • geom_smooth():拟合一条平滑曲线,并显示其执行区间
  • geom_boxplot():绘制箱线图来描述数据的分布情况
  • geom_histogram()和geom_freqpoly():绘制直方图来描述数据的分布情况
  • geom_bar():绘制分类型变量的分布情况
  • geom_path() 和 geom_line():path()可以画出图形的轨迹,可以从右到左也可以从左到右,line()函数一班是绘制图形从左到右

✏️1.4.1 在图形上增加一个平滑曲线

当散点图有很多噪音时,这个时候我们往往较难发现变量间的关系。此时增加一条平滑线有利于我们判断变量的关系

# aes()默认第一个参数是x,第二个参数是y
ggplot(mpg,aes(displ,hwy)) + geom_point()+geom_smooth()
`geom_smooth()` using method = 'loess' and formula 'y ~ x'


在r语言中graph 在R语言中如何开启GPU_数据_05

上图得到了散点的平衡拟合曲线,并给出了其置信区间(灰色阴影部分),我们可以设置se=FALSE不显示置信区间
geom_smooth还有两个主要的参数是methodspan

  • method指的是平滑处理的方法,默认是loess
  • loess适合小样本
  • gams适合大样本,需要mgcv()包
  • lm适合线性拟合
  • glm和lm类似,但是更稳健,需要mass()包
  • span指的平衡水平,位于0-1,越大曲线越平衡
ggplot(mpg, aes(displ, hwy)) + 
  geom_point() + 
  geom_smooth(span = 0.2)

ggplot(mpg, aes(displ, hwy)) + 
  geom_point() + 
  geom_smooth(span = 1)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

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


在r语言中graph 在R语言中如何开启GPU_在r语言中graph_06

在r语言中graph 在R语言中如何开启GPU_坐标轴_07

✒️1.4.2 箱线图和抖动点

当数据集包含分类型变量和数值型变量时,我们往往需要研究对于分类型变量不同取值数值型变量是怎么变化的

首先我们照样使用散点图看看是什么情况

ggplot(mpg, aes(drv, hwy)) + 
  geom_point()

在r语言中graph 在R语言中如何开启GPU_数据_08

因为drv只有三个取值,并且有许多hwy相等,因此有许多重叠点,这样我们很难了解数据的分布,可以使用以下方法来解决这种问题:

  • 抖动,使用geom_jitter(),对每个数据增加一点随机扰动,这样可以避免数据太多重叠点
  • 箱线图,geom_boxplot(),通过一些描述性统计量来描述数据分布
  • 小提琴图,geom_violin(),展示概率密度分布函数。
# 使用fill或者col指定颜色
ggplot(mpg, aes(drv, hwy)) + geom_jitter()
ggplot(mpg, aes(drv, hwy,fill=drv)) + geom_boxplot()
ggplot(mpg, aes(drv, hwy,fill=drv)) + geom_violin()

在r语言中graph 在R语言中如何开启GPU_在r语言中graph_09

在r语言中graph 在R语言中如何开启GPU_数据可视化_10

在r语言中graph 在R语言中如何开启GPU_数据_11

🖋️1.4.3 直方图和频率多边形

直方图和频率多边形一样,可以描述某一个数值型变量单独的分布情况,相较于上述方法给出了变量的更具体分布情况

# 直方图
ggplot(mpg, aes(hwy)) + geom_histogram()
# 频率多边形
ggplot(mpg, aes(hwy)) + geom_freqpoly()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


在r语言中graph 在R语言中如何开启GPU_数据_12

在r语言中graph 在R语言中如何开启GPU_数据可视化_13

可以通过binwidth参数控制bin的宽度。也可以使用break控制

ggplot(mpg, aes(displ, colour = drv)) + 
  geom_freqpoly(binwidth = 0.5)

在r语言中graph 在R语言中如何开启GPU_数据_14

🖊️1.4.4 条形图

条形图也是来描述离散型变量的,使用geom_bar()

ggplot(mpg, aes(manufacturer)) + 
    geom_bar()

在r语言中graph 在R语言中如何开启GPU_坐标轴_15

🖌️1.4.5 时间序列图和路径图

折现图和路径图常常用于描述时序数据。折线图往往从左到右有时间顺序,而路径图往往没有时间顺序,我们使用economics数据集

head(economics)

A spec_tbl_df: 6 × 6

date

pce

pop

psavert

uempmed

unemploy

<date>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

1967-07-01

506.7

198712

12.6

4.5

2944

1967-08-01

509.8

198911

12.6

4.7

2945

1967-09-01

515.6

199113

11.9

4.6

2958

1967-10-01

512.2

199311

12.9

4.9

3143

1967-11-01

517.4

199498

12.8

4.7

3066

1967-12-01

525.1

199657

11.8

4.8

3018

uempmed表示失业周期的中位数,unemploy表示每个月的失业人数,unemploy/pop表示失业率

ggplot(economics, aes(date, unemploy / pop)) +
  geom_line()
ggplot(economics, aes(date, uempmed)) +
  geom_line()

在r语言中graph 在R语言中如何开启GPU_在r语言中graph_16

在r语言中graph 在R语言中如何开启GPU_在r语言中graph_16

从上述两个图来看两个数值随时间变化有一定差异,我们要是想研究这两个变量之间有什么关系,可以画这两个变量之间的图

ggplot(economics, aes(unemploy / pop, uempmed)) + 
  geom_path() +
  geom_point()

在r语言中graph 在R语言中如何开启GPU_坐标轴_18

year <- function(x) as.POSIXlt(x)$year+1900# 日期函数,得到年份
ggplot(economics, aes(unemploy / pop, uempmed)) + 
  geom_path(colour = "grey50") +
  geom_point(aes(colour = year(date)))

在r语言中graph 在R语言中如何开启GPU_坐标轴_19

我们可以看到,失业率和失业时间高度相关,但近年来,失业时间相对于失业率一直在增加。

💙1.5 设置坐标轴

下面我们介绍最常用的修改坐标轴的参数。

  • xlab()和ylab(),给坐标轴加标签
  • xlim()和ylim()设置坐标轴范围
ggplot(mpg, aes(cty, hwy)) +
  geom_point(alpha = 1 / 3) # 设置点的透明度

ggplot(mpg, aes(cty, hwy)) +
  geom_point(alpha = 1 / 3) + 
  xlab("city driving (mpg)") + 
  ylab("highway driving (mpg)")

ggplot(mpg, aes(cty, hwy)) +
  geom_point(alpha = 1 / 3) + 
  xlab(NULL) + 
  ylab(NULL)

在r语言中graph 在R语言中如何开启GPU_在r语言中graph_20

在r语言中graph 在R语言中如何开启GPU_坐标轴_21

在r语言中graph 在R语言中如何开启GPU_在r语言中graph_22

ggplot(mpg, aes(drv, hwy)) +
  geom_jitter(width = 0.25)

ggplot(mpg, aes(drv, hwy)) +
  geom_jitter(width = 0.25) + 
  xlim("f", "r") + 
  ylim(20, 30)
ggplot(mpg, aes(drv, hwy)) +
  geom_jitter(width = 0.25, na.rm = TRUE) + 
  ylim(NA, 30)
Warning message:
"Removed 141 rows containing missing values (geom_point)."

在r语言中graph 在R语言中如何开启GPU_数据可视化_23

在r语言中graph 在R语言中如何开启GPU_在r语言中graph_24

在r语言中graph 在R语言中如何开启GPU_数据_25

💚1.6 保存图片

在ggplot中,我们可以使用一个对象接受图片

p <-  ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
  geom_point()
# 使用print打印图片
print(p)

在r语言中graph 在R语言中如何开启GPU_数据_26

# 使用ggsave()保存图片
ggsave("plot.png", p, width = 5, height = 5)