本系列主要介绍R语言在数据分析领域的应用包括: R语言编程基础、R语言可视化、R语言进行数据操作、R语言建模、R语言机器学习算法实现、R语言统计理论方法实现。 本系列会完成下去,请大家多多关注点赞支持,一起学习~ 参考资料: Data Analysis and Prediction Algorithms with R
可视化是R语言数据分析中的强项。R语言中的ggplot2大大的增加了数据可视化的灵活性。本章主要介绍ggplot2的基本绘图,以后打算撰写一个关于ggplot2的专栏
## 导入相关库算撰写一个关于ggplot2的专栏
## 导入相关库
library(dplyr)
library(ggplot2)
使用ggplot2可能需要记住一些函数和参数,说实话,很难将它们记住。因此我建议大家可以保存ggplot2-cheatsheet,在画图的时候可以参考
学习ggplot2首先知道怎么将图形分解成若干个组成部分
第一步定义一个ggplot对象
library(dslabs)
data(murders)
ggplot(data = murders)
由于我们没有进行任何图形设置,返回了一个空的画板
在ggplot2中,我们通过增加图层来进行图形的可视化。使用+
来增加不同的图层。 一般我们先增图形类型。geom_X,其中X代表某一特定的图形。例如geom_point,geom_bar,geom_histogram。常见的语法如下所示
data %>% ggplot() + layer1 + layer2
美学映射描述了数据的属性如何与图形的特征连接。例如坐标轴、颜色、大小。使用aes()函数来定义这些属性,作为geom_X的一个参数,例如我们要画散点图
murders %>% ggplot() + geom_point(aes(x=population/10^6, y=total))
我们可以通过增加层级来给图形增加标签。使用geom_text 和 geom_label可以在图形中增加文本。 下面我们希望对每个点都希望增加标签,因此需要使用aes定义lab
murders %>% ggplot() + geom_point(aes(population/10^6, total)) +
geom_text(aes(population/10^6, total, label = abb))
每个几何图形函数都有很多参数,例如我们希望改变图形点的大小和颜色,使用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)#正数表示向右平移
上述我们使用了两次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
我们可以对数据的尺度进行转换,使用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()
同样我们可以设置坐标轴标签和图形标题
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")
和最初的图形比较,我们发现此时图形看起来美观了不少,下面我们介绍如何增加颜色
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不显示图例
下面我们通过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))
由于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