玩转数据可视化之R语言ggplot2:(一)ggplot2实现箱线图、小提琴图、直方图等图形(快速入门)

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


  • 🌸个人主页:JoJo的数据分析历险记
  • 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
  • 💌如果文章对你有帮助,欢迎关注、点赞、收藏、订阅专栏

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

💘1.ggplot2基础介绍

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

💔1.1案例数据说明

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

# 导入库
library(ggplot2)
# 如果没有ggplot2库,使用install.packages('ggplot2')
# 查看数据集
head(mpg)
A tibble: 6 × 11
manufacturermodeldisplyearcyltransdrvctyhwyflclass
<chr><chr><dbl><int><int><chr><chr><int><int><chr><chr>
audia41.819994auto(l5) f1829pcompact
audia41.819994manual(m5)f2129pcompact
audia42.020084manual(m6)f2031pcompact
audia42.020084auto(av) f2130pcompact
audia42.819996auto(l5) f1626pcompact
audia42.819996manual(m5)f1826pcompact

各个变量解释如下:

  • 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()

png

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

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

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

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

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

png

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

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

png

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

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

png

这样可以使代码更简洁,大家可以参考我的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'

png

上图得到了散点的平衡拟合曲线,并给出了其置信区间(灰色阴影部分),我们可以设置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'

png

png

✒️1.4.2 箱线图和抖动点

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

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

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

png

因为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()

png

png

png

🖋️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`.

png

png

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

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

png

🖊️1.4.4 条形图

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

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

png

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

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

head(economics)
A spec_tbl_df: 6 × 6
datepcepoppsavertuempmedunemploy
<date><dbl><dbl><dbl><dbl><dbl>
1967-07-01506.719871212.64.52944
1967-08-01509.819891112.64.72945
1967-09-01515.619911311.94.62958
1967-10-01512.219931112.94.93143
1967-11-01517.419949812.84.73066
1967-12-01525.119965711.84.83018

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

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

png

png

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

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

png

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

png

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

💙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)

png

png

png

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)."

png

png

png

💚1.6 保存图片

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

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

png

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

💟文章推荐

如果想了解更多ggplot2数据可视化技巧,欢迎访问下列文章
🌟玩转数据可视化之R语言ggplot2:(二)ggplot2实现分面绘图(Faceting),包括连续变量的转换(快速入门)
🌝玩转数据可视化之R语言ggplot2:(三)ggplot2实现将多张图放在一起,包括并排和插图绘制(快速入门)
🌞玩转数据可视化之R语言ggplot2:(四)单一基础几何图形绘制

posted @ 2022-08-27 11:08  JOJO数据科学  阅读(1149)  评论(0编辑  收藏  举报