【R语言数据科学】:(六)数据可视化之ggplot2详解-灵析社区

秋叶无缘

R语言数据科学

本系列主要介绍R语言在数据分析领域的应用包括: R语言编程基础、R语言可视化、R语言进行数据操作、R语言建模、R语言机器学习算法实现、R语言统计理论方法实现。 本系列会完成下去,请大家多多关注点赞支持,一起学习~ 参考资料: Data Analysis and Prediction Algorithms with R

💘6.ggplot2介绍

可视化是R语言数据分析中的强项。R语言中的ggplot2大大的增加了数据可视化的灵活性。本章主要介绍ggplot2的基本绘图,以后打算撰写一个关于ggplot2的专栏

## 导入相关库算撰写一个关于ggplot2的专栏
## 导入相关库
library(dplyr)
library(ggplot2)

使用ggplot2可能需要记住一些函数和参数,说实话,很难将它们记住。因此我建议大家可以保存ggplot2-cheatsheet,在画图的时候可以参考

💮6.1 图形的组成部分

学习ggplot2首先知道怎么将图形分解成若干个组成部分

    • data:通过某一数据创建ggplot2对象
    • geometry:图形类型
    • aesthetic mapping:增加一些图形信息

🏵️6.2 ggplot对象

第一步定义一个ggplot对象

library(dslabs)
data(murders)
ggplot(data = murders)

由于我们没有进行任何图形设置,返回了一个空的画板

🌹6.3 图形类型

在ggplot2中,我们通过增加图层来进行图形的可视化。使用+来增加不同的图层。 一般我们先增图形类型。geom_X,其中X代表某一特定的图形。例如geom_point,geom_bar,geom_histogram。常见的语法如下所示

data %>% ggplot() + layer1 + layer2

🥀6.4 美学映射

美学映射描述了数据的属性如何与图形的特征连接。例如坐标轴、颜色、大小。使用aes()函数来定义这些属性,作为geom_X的一个参数,例如我们要画散点图

murders %>% ggplot() + geom_point(aes(x=population/10^6, y=total))

🌺 6.5 层级

我们可以通过增加层级来给图形增加标签。使用geom_text 和 geom_label可以在图形中增加文本。 下面我们希望对每个点都希望增加标签,因此需要使用aes定义lab

murders %>% ggplot() + geom_point(aes(population/10^6, total)) +
  geom_text(aes(population/10^6, total, label = abb))

🌻6.6 调整参数

每个几何图形函数都有很多参数,例如我们希望改变图形点的大小和颜色,使用size和col

murders %>% ggplot() + geom_point(aes(population/10^6, total),size=3,col='red') +
  geom_text(aes(population/10^6, total, label = abb))

注意,我们发现size和col参数并不在aes中。这里给大家一个小tips:
aes是使用来着样本某一特定观测数据来作为参数,例如我们的population和total,其余的不需要放在aes()中
上述图形的点太大了,导致很难看清楚具体分布情况,我们可以使用geom_text中的nudge_x参数,调整文本位置

murders %>% ggplot() + geom_point(aes(population/10^6, total)) +
  geom_text(aes(population/10^6, total, label = abb),nudge_x = 1.5)#正数表示向右平移

🌼6.7 全局和局部美学映射

上述我们使用了两次aes(population/10^6, total),在每一个几何对象中都使用了。我们可以通过设置全局映射来实现代码的简化

# 查看ggplot参数
args(ggplot)
function (data = NULL, mapping = aes(), ..., environment = parent.frame()) 
NULL

可以看出其中有mapping的定义,下面我们在定义ggplot对象时,先设定美学映射,还是上面那个例子,我们可以简化代码如下

p <- murders %>% ggplot(aes(population/10^6, total, label = abb)) 
p + geom_point(size=3) +
geom_text(nudge_x = 1.5)

当然,当我们需要使用新的美学映射时,可以在相应的geometry重新定义

p + geom_point(size = 3)+
geom_text(x=10,y=800,label='JOJO')

在第二个geom_text中,我们没有使用population和total

🌷6.8 尺度变换

我们可以对数据的尺度进行转换,使用scale_x_continuous()函数,其中trans参数来指定转换形式 例如进行log-转换

p + geom_point(size = 3) +
# 此时取对数,需要将nudge_x 设定较小
geom_text(nudge_x = 0.05)+
scale_x_continuous(trans = 'log10')+
scale_y_continuous(trans = 'log10')

在r中可以有scale_x_log10()函数直接转换标签

p + geom_point(size = 3) +
# 此时取对数,需要将nudge_x 设定较小
geom_text(nudge_x = 0.05)+
scale_x_log10()+
scale_y_log10()

注意:这里只是数据在图形中的位置取了对数,从而改变了原始坐标轴刻度,而不是对数据值进行变换。下面看一个简单的例子更好的理解

x <- c(1,10,100,1000)
y <- c(1,10,100,1000)
df <- data.frame(x,y)
ggplot(df)+ geom_point(aes(x,y))

上述是未做尺度变化前的图,下面来看看去log10变换后的结果

ggplot(df)+ geom_point(aes(x,y))+scale_x_log10()+scale_y_log10()

🌱6.9 坐标轴和标题

同样我们可以设置坐标轴标签和图形标题

p + geom_point(size = 3) +
# 此时取对数,需要将nudge_x 设定较小
geom_text(nudge_x = 0.05)+
scale_x_log10()+
scale_y_log10()+
  xlab("Populations in millions (log scale)") + 
  ylab("Total number of murders (log scale)") +
  ggtitle("US Gun Murders in 2010")

和最初的图形比较,我们发现此时图形看起来美观了不少,下面我们介绍如何增加颜色

🌲6.10 增加颜色

p <-  murders %>% ggplot(aes(population/10^6, total, label = abb)) +   
  geom_text(nudge_x = 0.05) + 
  scale_x_log10() +
  scale_y_log10() +
  xlab("Populations in millions (log scale)") + 
  ylab("Total number of murders (log scale)") +
  ggtitle("US Gun Murders in 2010")
p + geom_point(size = 3,col='red') 

我们希望根据区域来定义颜色,注意,此时我们使用了数据的region值,因此此时需要用aes来定义

p + geom_point(aes(col=region), size = 3)

可以看出ggplot2会自动生成图例,可以使用show.legend=FALSE不显示图例

🌳6.11 增加拟合曲线或注释

下面我们通过y=rx拟合这些点,其中y是total,x是population,r=sum(total)/sum(population)*10^6.由于我们对数据取了对数变换,则log(y)=log(r)+log(x),此时可以拟合一条斜率为1,截距为log(r)的曲线

# 首先计算r
r <- murders %>% 
  summarize(rate = sum(total) /  sum(population) * 10^6) %>% 
  pull(rate)#将rate变为数值型数据

使用geom_abline增加曲线,需要两个参数,截距默认为0,斜率默认为1

p + geom_point(aes(col=region), size = 3) + 
  geom_abline(intercept = log10(r))

🌴6.12 ggplot2附加库

由于ggplot2的一些附加库,让ggplot2可视化的功能变得格外强大。主要有ggthemes和ggrepel包

ggplot2的图形主题可以用theme()函数,例如使用dslabs主题的图,使用ds_theme_set()定义

ds_theme_set()
p + geom_point(aes(col=region), size = 3) + 
  geom_abline(intercept = log10(r))

还有很多其他图形主题在ggthemes中,下面使用theme_economist主题

library(ggthemes)
p + geom_point(aes(col=region), size = 3) + 
  geom_abline(intercept = log10(r)) + theme_economist()

可以使用 theme_fivethirtyeight()查看有哪些主题。
上图还有一个问题就是有的标签相互重叠了。可以使用ggrepel库,可以避免标签不会相互重叠。
使用geom_text_repel代替geom_text

library(ggthemes)
library(ggrepel)

r <- murders %>% 
  summarize(rate = sum(total) /  sum(population) * 10^6) %>%
  pull(rate)

murders %>% ggplot(aes(population/10^6, total, label = abb)) +   
  geom_abline(intercept = log10(r), lty = 1, color = "black") +
  geom_point(aes(col=region), size = 3) +
  geom_text_repel() + 
  scale_x_log10() +
  scale_y_log10() +
  xlab("Populations in millions (log scale)") + 
  ylab("Total number of murders (log scale)") +
  ggtitle("US Gun Murders in 2010") + 
  scale_color_discrete(name = "Region") +
  theme_economist()

阅读量:2022

点赞量:0

收藏量:0