### 学习者:晨曦
### 更新时间:2021-08-31
# Use ggplot2
# ggplot2基本要素
# 1.数据映射
# 2.几何对象
# 3.标尺
# 4.统计变换
# 5.坐标系统
# 6.图层
# 7.分面
# 8.主题
# 这里将从这些基本要素对ggplot2进行介绍
## 数据映射
library(ggplot2)
data(diamonds)
set.seed(42)
head(diamonds)
str(diamonds)
small <- diamonds[sample(nrow(diamonds),1000),]
table(small$price)
head(small)
#画图实际上是把数据中的变量映射到图形属性上。以克拉数为X轴变量,价格为Y轴变量
ggplot(data = small,mapping = aes(x = carat,y = price))+
geom_point()
#上面这行代码把数据映射XY坐标轴上,需要告诉ggplot2,这些数据要映射成什么样的几何对象,下面以散点为例:
p+geom_point()
#如果想将切工(cut)映射到形状属性。只需要:
p <- ggplot(data = small,mapping = aes(x = carat,y = price,shape=cut))
p+geom_point()
#再比如我想将钻石的颜色(color)映射颜色属性:
ggplot(data = small,mapping = aes(x = carat,y = price,colour=color,shape=cut))+
geom_point()
## 几何对象
#在上面的例子中,各种属性映射由ggplot函数执行,只需要加一个图层,使用geom_point()告诉ggplot要画散点,于是所有的属性都映射到散点上。
#geom_point()完成的就是几何对象的映射,ggplot2提供了各种几何对象映射,如geom_histogram用于直方图,geom_bar用于画柱状图,geom_boxplot用于画箱式图等等。
#不同的几何对象,要求的属性会有些不同,这些属性也可以在几何对象映射时提供,比如上一图,也可以用以下语法来画
ggplot(small)+
geom_point(aes(x=carat,y = price,shape=cut,colour=color))
#ggplot2支持图层,我通常把不同的图层中共用的映射提供给ggplot函数,而某一几何对象才需要的映射参数提供给geom_xxx函数
#这其实就是全局映射和局部映射,当全局映射和局部映射冲突的时候,遵循局部映射
#这一小节我们来看一下各种常用的几何对象
#直方图:提供一个X变量,画出数据的分布(X变量可以是连续型)
ggplot(small)+
geom_histogram(aes(x = price))
ggplot(small)+
geom_histogram(aes(x = price,color=cut))
#fill参数如果换成colour,则是描边,而不是填充,体会和下面代码的区别
ggplot(small)+
geom_histogram(aes(x = price),color="red")
ggplot(small)+
geom_histogram(aes(x = price,fill=cut),position = "dodge")
ggplot(small)+
geom_histogram(aes(x = price,fill=cut),position = "fill")
#柱状图
#柱状图非常适合于画分类变量。在这里以透明度(clarity)变量为例。按照不同透明度的钻石的数目画柱状图。
ggplot(small)+
geom_bar(aes(x = clarity))
#柱状图两个要素,一个是分类变量,一个是数目,也就是柱子的高度。数目在这里不用提供,因为ggplot2会通过x变量计算各个分类的数目。
#当然你想提供也是可以的,通过stat参数,可以让geom_bar按指定高度画图,比如以下代码:
ggplot()+
geom_bar(aes(x = c(LETTERS[1:3]),y = 1:3),stat = "identity")
#直方图把连续型的数据按照一个个等长的分区(bin)来切分,然后计数
#柱状图是分类数据,按类别计数。我们可以用前面直方图的参数来画side-by-side的柱状图,填充颜色或者按比例画图,它们是高度一致的。
#柱状图是用来表示计数数据的,但在生物界却被经常拿来表示均值,加上误差来表示数据分布
#密度函数图
#说到直方图,就不得不说密度函数图,数据和映射和直方图是一样的
#唯一不同的是几何对象,geom_histogram告诉ggplot要画直方图,而geom_density则说我们要画密度函数图
ggplot(small)+
geom_density(aes(x = price,colour=cut))
ggplot(small)+
geom_density(aes(x = price,fill=clarity))
#colour参数指定的是曲线的颜色,而fill是往曲线下面填充颜色
#箱式图
#数据量比较大的时候,用直方图和密度函数图是比较数据分布的好办法,而在数据量比较小的时候
#比如很多的生物实验方法,很多时候大家都是用柱状图+errobar的形式来表示的
#不过这种方法的信息量非常低,所以推荐使用boxplot
ggplot(data = small)+
geom_boxplot(aes(x = cut,y = price,fill=color))
#横轴是分类变量,纵轴是连续型变量
##标尺
#前面我们已经看到,画图就是在映射,不管是映射到不同的几何对象,还是映射各种图形属性
#在对图形属性进行映射后,使用标尺可以控制这些属性的显示方式
#比如坐标刻度,可以通过标尺将坐标进行对数转换
#比如颜色属性,可以通过标尺进行改变
ggplot(small)+
geom_point(aes(x = carat,y = price,shape=cut,colour=color))+
scale_y_log10()+
scale_color_manual(values = rainbow(7))
#ggplot2内置配色
#ggplot2提供了海量的默认配色方案和DIY配色选项,根据色彩显示类型分为两大类
#连续型(渐变色)和离散型(差异色)
#连续型
#根据颜色梯度色彩数量划分,共有三种连续型颜色梯度
ggplot(small)+
geom_point(aes(x = carat,y = price,colour=x))+
scale_color_gradient(low = "red",high = "blue")
#参数low和high用于控制此梯度两端颜色
#这里需要注意如果使用这个函数,映射颜色colour参数对应的变量需要是连续型
ggplot(small)+
geom_point(aes(x = carat,y = price,shape=cut,colour=x))+
scale_color_gradient(low = "lightgreen",high = "darkgreen")
?scale_color_gradient
#配色网站:https://mycolor.space/
#上面讲解的都是双色梯度,下面介绍的则是三色梯度
ggplot(small)+
geom_point(aes(x = carat,y = price,colour=x))+
scale_color_gradient2(low = "white",mid = "black",high = "red",midpoint = 7)
#midpoint参数越大,low参数所对应的颜色占比就越大
#scale_colour_gradientn()和scale_fill_gradientn():自定义的n 色梯度。
#此标度需要赋给参数colours 一个颜色向量。不加其他参数的话,这些颜色将依照数据的范围均匀地分布
#如果你需要让这些值不均匀地分布,则可以使用参数values
#如果参数rescale 的值是TRUE(默认),则values 应在0和1之间取值,如果rescale 取值FALSE,则values 应在数据范围内取值。
#参考教程:https://www.jianshu.com/p/2fc71d3c207b
##统计变换
#统计变化对原始数据进行某种计算,然后在图上表现出来,例如对散点图上加一条回归线
#鉴别一下:
#错误
ggplot(data = small)+
geom_point(aes(x = carat,y = price))+
scale_y_log10()+
stat_smooth()
#正确
ggplot(small,aes(x = carat,y = price))+
geom_point()+
scale_y_log10()+
stat_smooth()
#这里就涉及到了全局映射和局部映射之间的关系了
#aes所提供的参数,就通过ggplot提供,而不是提供给geom_point
#因为ggplot里的参数,相当于全局变量,geom_point()和stat_smooth()都知道x,y的映射
#如果只提供给geom_point(),则相当于是局部变量,geom_point知道这种映射,而stat_smooth不知道
#当然你再给stat_smooth也提供x,y的映射,不过共用的映射,还是提供给ggplot好
#统计变换很重要值得我们多加学习
##坐标系统
#翻转坐标系,横轴变纵轴,纵轴变横轴
ggplot(small)+
geom_bar(aes(x = cut,fill=cut))+
coord_flip()
ggplot(small)+
geom_bar(aes(x = factor(1),fill=cut))+
coord_polar(theta = "y")
?coord_polar
#这里为什么aes参数内x要设置为1
#其含义为cut中观测相加起来为1
#饼图实际上就是柱状图,只不过是使用极坐标而已
#柱状图的高度,对应于饼图的弧度,饼图并不推荐,因为人类的眼睛比较弧度的能力比不上比较高度
ggplot(small)+
geom_bar(aes(x = factor(1),fill=cut))+
coord_polar()
ggplot(small)+
geom_bar(aes(x = clarity,fill=cut))+
coord_polar()
##图层
#PS在3.0时引入图层的概念
#ggplot2用+号来叠加图层,堪称是泛型编程的典范
#前面我们所绘制的图形,或多或少都使用了这个概念
##分面
#分面可以让我们按照某种给定的条件,对数据进行分组,然后分别画图
#在统计变换中,如果按照单一白能量做回归曲线,图十分的乱
#有了分面功能,我们可以分别作图
ggplot(small,aes(x = carat,y = price))+
geom_point(aes(colour=cut))+
scale_y_log10()+
facet_wrap(~cut)+
stat_smooth()
##主题
#通过ggplot画图之后,我们还可以对图进行定制
ggplot(small,aes(x = cut,y = price,fill=color))+
geom_boxplot()+
ggtitle("Price vs Cut")+
xlab("Cut")+
ylab("Price")
#但是这个远远满足不了需求
#我们需要改变字体,字体大小,坐标轴,背景等各种元素
#这需要通过theme()函数来完成
require(ggthemes)
ggplot(small,aes(x = cut,y = price,fill=color))+
geom_boxplot()+
#theme_classic()
theme_economist()Day_07直播
聚焦本主题的核心概念、常用代码与实操提示,便于快速查阅。