第 3 章 数据可视化
数据可视化是R里面非常重要的一项功能,R语言作图非常强大,不仅仅R base基本自带的功能可以实现大多数作图要求,而且还有海量的安装扩展包,使得作图内容更加丰富,这个章节我除了简单介绍R基本作图方法,还会着重介绍一下 ggplot2
这个安装包,这个是一个非常强大的也在R安装包里面最为出名的绘图包,拥有丰富多彩的绘图语言,而且可以根据自己的喜好自由修改各个参数,非常适合于科研绘图。首先我先将R里面常见的绘图方法给大家简单介绍一下。
3.1 散点图
这类的图很常见,在R里面实现非常简单。下面我们看一个示例。我们调用R自带的一个数据iris3
来进行绘图。
data("iris")
plot(iris)## plot 程序默认使用散点
可以看到,如果直接把这个数据plot出来的话,会将每个因子一一作成相关图,这样非常方面粗略判断数据的形式,各个因子的相关性,如果你不想看到全部因子的相关性,你只想对其中两个因子的关系进行绘图,我们可以进行下一步,比如我想具体查看一下 Sepal.Width
和 Petal.Length
的相关性,我们可以用 $
符号跟在数据集名字后面进行特定因子选择,如下:
# 横坐标为Sepal.Width,纵坐标为Petal.Length
plot(iris$Sepal.Width,iris$Petal.Length)
3.1.1 改变标题和坐标轴字体
data("iris")
library(showtext)
showtext.auto(enable = TRUE)
plot(iris$Sepal.Width,iris$Petal.Length,
family= "kaishu",
xlab= '我是x轴',# 设定x轴名称
ylab = '我是y轴',# 设定y轴名称
main = '我是个标题(I am a title)')# 设定标题名称
3.1.2 改变散点及字体大小
cex
在plot程序里用来调节图中散点的大小。cex.lab
、cex.axis
和cex.main
可以调节标题和坐标轴的大小,值可以取大于零的任何数,同样的,我们也可以根据分组,按照不同的分组进行大小调节,如果分组不是numeric
形式而是factor
或者 character
的话,要转换成这个形式numeric
才可以用哦.
library(showtext)
showtext.auto(enable = TRUE)
plot(iris$Sepal.Width,iris$Petal.Length,
main = '我是个标题(I am a title)',
family= "kaishu",
xlab= '我是x轴',# 设定x轴名称
ylab = '我是y轴',# 设定y轴名称
cex=2,
cex.lab= 1,
cex.axis= 2,
cex.main = 2)
#根据分组变大小
plot(iris$Sepal.Width,iris$Petal.Length,
main = '我是个标题(I am a title)',#标题
family= "kaishu",#指定字体类型
cex=as.numeric(iris$Species),# 散点大小,按分组
xlab= '我是x轴',# 设定x轴名称
ylab = '我是y轴',# 设定y轴名称
cex.lab= 1,# 坐标标签字体大小
cex.axis= 2,# 坐标轴字体大小
cex.main = 2)# 标题字体大小
3.1.3 改变散点颜色和类型
col
在plot程序里用来调节图中散点的颜色。pch
、 可以调节散点类型,值可以取大于零的任何数,也可以是指定名字,具体颜色和pch类型种类很多,我这里就不展开讲,同样,也可以根据分组进行颜色和类型作图:
##
plot(iris$Sepal.Width,iris$Petal.Length,main = '我是个标题(I am a title)',family= "kaishu",
cex=2,cex.lab= 1,
cex.axis= 2,
cex.main = 2,
xlab= '我是x轴',# 设定x轴名称
ylab = '我是y轴',# 设定y轴名称
col=2,# or col= 'red',
pch=as.numeric( iris$Species)#或者不同数值
)
plot(iris$Sepal.Width,iris$Petal.Length,main = '我是个标题(I am a title)',family= "kaishu",
cex=2,cex.lab= 1,
cex.axis= 2,
cex.main = 2,
xlab= '我是x轴',# 设定x轴名称
ylab = '我是y轴',# 设定y轴名称
col=iris$Species,#根据分组
pch=as.numeric( iris$Species)#或者不同数值
)
3.2 ggplot 散点图
接下来的每个小章节,在介绍完如何用R基础或者其他安装包完成各种图形的绘制时,都会着重讲一下如何用ggplot
来实现。前面我们介绍了使用R常规方法来进行散点图的绘制,下面我们来看一下如何用ggplot2
这个安装包的 ggplot
程序来进行散点图绘制。同样的使用iris
这个数据。ggplot
的代码结构很简单,首先我们使用ggplot
程序来调用程序,括号里面首先我们需要告诉ggplot
我们使用什么数据,这里我们使 iris
这个数据,然后我们aes
在ggplot
里面是要告诉我们使用这个数据里面的那两个值进行散点图得绘制,这里我们选择的是跟前面的一样的变量,Sepal.Width
和 Sepal.Length
,系统默认第一个是x
坐标,第二个是y
坐标,你也可以使用 x=
和 y=
来指定这个数据里面的变量做x
和y
。 然后这个主题就做好了,接下来是要用geom_
告诉ggplot
我们要用什么形式做散点图。这里我们用到 geom_point()
,下面就是例子:
data("iris")
library(ggplot2)
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point()
3.2.1 改变散点特征、大小及颜色
data("iris")
library(ggplot2)
##指定颜色大小
## size用来设定大小
## col 用来设置颜色
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point(size =2,col = 'red')
##按分组颜色与大小
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point(size =as.numeric(iris$Species),col = as.numeric(iris$Species))
##按分组的特征、大小与颜色
# shape 用来设置特征
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point(size =as.numeric(iris$Species),
shape= as.numeric(iris$Species),
col = as.numeric(iris$Species))
3.2.2 改变坐标轴相关指标
theme
可以用来对 ggplot
所作图形进行参数修改,相当于添加很多个图层在原始图片上,非常方便。接下来我们介绍几种常见的设置。
data("iris")
library(ggplot2)
##指定颜色大小
## size用来设定大小
## col 用来设置颜色
##按分组颜色与大小
### 把背景变为经典白 theme_classic()
##base_size用来调节坐标轴字体大小
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point(size =as.numeric(iris$Species),
col = as.numeric(iris$Species))+
theme_classic(base_size = 16)
### 把背景变为经典黑 theme_dark()
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point(size =as.numeric(iris$Species),
col = as.numeric(iris$Species))+
theme_dark()
### 根据自己需要进行坐标轴相关修改
ggplot( iris, aes(Sepal.Width,Sepal.Length))+
geom_point(size =as.numeric(iris$Species),
col = as.numeric(iris$Species))+
##axis.text 用来修改坐标轴数字的大小颜色等指标
theme(axis.text = element_text(size = 15),
##axis.title 用来修改坐标轴lable字体相关内容,可以修改,字体类型,字体大小,字体颜色,字体粗斜体等
axis.title = element_text(size = 15),
##axis.line.x 用来修改横坐标X 线条的相关指标
axis.line.x = element_line(colour = 'black'),
##axis.line.y 用来修改纵坐标Y 线条的相关指标
axis.line.y = element_line(colour = 'black'),
## panel.background 用来修改整个图层底部颜色等相关指标
panel.background = element_rect(color ='grey',fill = "white",linetype =0 ),
## panel.grid 用来修改图中网格,这里我设置成blank,就是没有网格。
panel.grid = element_blank()
+
) ##xlab 和 ylab 用来修改横纵坐标的名称。
xlab(label = 'x lables ') +
ylab('y lables')
你也可以通过 ?theme 来查看所有theme里面的代码
3.3 线性图
线性图也是一种常见的数据分析图,R里面实现线性图非常简单,对于大量的光谱数据,我们可以继续使用 matplot
程序。这里我们用光谱数据来举例,光谱数据,每个样本都会有一个光谱数据,我们这里的光谱数据为9000 cm^-1 到 4000 cm^-1, 我们这里将这个光谱数据用线性图表达出来。我们用数据的 colnames
做横坐标,然后每个点的值做纵坐标。
<- readRDS('my_data.rds')
data # 将 光谱数据提取出来当成一个数据
<- as.matrix(data[1:1296])
nir <- as.numeric(colnames(nir))
x #这里的 t 是转置的意思,将数据转置一下,以达到x,y的 有同样的row数据
#这里我对col、cex 等进行了设置,让大家可以清楚如何设置
matplot(x, t(nir),type='l',xlim =c(9000,4000),
xlab = expression(paste('Wavelength (cm'^'2',')')),
ylab = 'Absorbance',
#lty 是设置linetype 类型,可以数字,也可以是指定名字
lty = 1,
# lwd 是设置线性的粗细度
lwd = 2,
main = 'I am a title',
cex.lab=2,
cex.axis =2,
col.lab = 'red',
col.axis = 'red'
)
3.4 ggplot线性图
我们当然也可以使用ggplot来做线性图,而且图形更容易进行编辑。
#调取 光谱数据
<- readRDS('my_data.rds')
data ## 给光谱数据增加一行factor变量
$rowname <- rownames(data)
datalibrary(reshape2)
## 将数据由宽变窄
<- melt(data,id.vars = 'rowname')
melt_data str(melt_data)
## 'data.frame': 36288 obs. of 3 variables:
## $ rowname : chr "B1-11.0000" "B1-11.0001" "B1-11.0002" "B1-11.0003" ...
## $ variable: Factor w/ 1296 levels "8995","8991",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ value : num 0.206 0.26 0.201 0.275 0.213 ...
## 这里varible是factor形式,需要变成
ggplot(melt_data,aes(as.numeric(as.character(variable)),value,group = rowname))+
geom_line(col = 'grey',size= 1)+
##axis.text 用来修改坐标轴数字的大小颜色等指标
theme(axis.text = element_text(size = 15,colour = 'red'),
##axis.title 用来修改坐标轴lable字体相关内容,可以修改,字体类型,大小,颜色,粗斜体等
axis.title = element_text(size = 15,colour = 'red'),
##axis.line.x 用来修改横坐标X 线条的相关指标
axis.line.x = element_line(colour = 'black'),
##axis.line.y 用来修改纵坐标Y 线条的相关指标
axis.line.y = element_line(colour = 'black'),
## panel.background 用来修改整个图层底部颜色等相关指标
panel.background = element_rect(color ='grey',fill = "white",linetype =0 ),
## panel.grid 用来修改图中网格,这里我设置成blank,就是没有网格。
panel.grid = element_blank()
+
) xlim(9000,4000)+
##xlab 和 ylab 用来修改横纵坐标的名称。
xlab(label = 'x lables ') +
ylab('y lables')
3.5 箱型图(boxplot)
箱型图可以用来比较各个因子之间的对比关系,以 iris
数据为例,我想知道三种 Species
里面 Sepal.Length
的分布情况,这时候我们就可以用boxplot 来完成。
#调取 光谱数据
data("iris")
##其中参数修改参考
boxplot(Sepal.Length ~ Species,data = iris)
3.6 ggplot箱型图
我们当然也可以使用ggplot来做箱型图也很简单。其中的参数修改可以参考 3.2和 3.4。
#调取 光谱数据
data("iris")
library(ggplot2)
##其中参数修改参考
ggplot(iris,aes(Species,Sepal.Length,fill = Species))+geom_boxplot(
# custom boxes
# color="blue",
##alpha用来设置透明度
alpha=0.7,
# Notch?试试notch=T
notch=F,
notchwidth = 0.8,
# custom outliers
outlier.colour="red",
outlier.fill="red",
outlier.size=3
+
)##你也可以指定三个分组的fill颜色
scale_fill_manual(values = c('red','red','black'))
你也可以做一些比较有趣的箱形图,这个可以通过viridis
和 ggExtra
安装包来实现.
#调取 光谱数据
data("iris")
library(ggplot2)
library(viridis)
## 载入需要的程辑包:viridisLite
library(ggExtra)
##其中参数修改参考
ggplot(iris,aes(Species,Sepal.Length,fill = Species))+
# geom_boxplot(
# # custom boxes
# # color="blue",
# ##alpha用来设置透明度
# alpha=0.7,
# # Notch?试试notch=T
# notch=F,
# notchwidth = 0.8,
#
# # custom outliers
# outlier.colour="red",
# outlier.fill="red",
# outlier.size=3
# )+
geom_violin() +
# scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A")+
##你也可以指定三个分组的fill颜色
scale_fill_manual(values = c('red','red','black'))
#调取 光谱数据
data("iris")
library(ggplot2)
library(viridis)
library(ggExtra)
<- ggplot(iris,aes(Sepal.Width,Sepal.Length,fill = Species))+
p # geom_boxplot(
# # custom boxes
# # color="blue",
# ##alpha用来设置透明度
# alpha=0.7,
# # Notch?试试notch=T
# notch=F,
# notchwidth = 0.8,
#
# # custom outliers
# outlier.colour="red",
# outlier.fill="red",
# outlier.size=3
# )+
geom_point() +
# scale_fill_viridis(discrete = TRUE, alpha=0.6, option="A")+
##你也可以指定三个分组的fill颜色
scale_fill_manual(values = c('red','red','black'))
library(ggplot2)
library(viridis)
library(ggExtra)
ggMarginal(p, type="boxplot")
ggMarginal(p, type="density")
ggMarginal(p, type="histogram")
3.7 热图
热图是一种比较常见的相关图的一种,通常都会结合相关图进行相关性数据可视化。R
里面自带绘制热图程序,heatmap()
,我们继续用iris
数据为例。由于热图要求数据必须是matrix
形式,因此不能出现factor
的行。
#调取 光谱数据
data("iris")
##其中参数修改参考
heatmap(as.matrix(iris[1:4]))
#数据标准化
heatmap(as.matrix(iris[1:4]),scale = 'column',col = cm.colors(256))
3.8 ggplot热图
热图是一种比较常见的相关图的一种,通常都会结合相关图进行相关性数据可视化。R
里面自带绘制热图程序,heatmap()
,我们继续用iris
数据为例。由于热图要求数据必须是matrix
形式,因此不能出现factor
的行。
#调取 光谱数据
data("iris")
library(reshape2)
<- as.matrix(iris[1:4])
mar_iris <- melt(mar_iris )
data_iris names(data_iris) <- c('x','y','value')
# Heatmap
ggplot(data_iris, aes(x,y, fill=value)) +
geom_tile()+
#scale_fill_gradient() 可以对 热图进行调色
scale_fill_gradient(low="white", high="blue")
3.9 相关图
相关性图表在分析数据关联性上非常好用,R在这方面也非常强大,我们先来看看R里面的安装包library(corrplot)
来做相关图,依然用iris
数据为例,我们想了解一下数据集里面 Sepal.Length
,Sepal.Width
,Petal.Length
,Petal.Width
这四个性状的相关性,首先我们先来做一下相关性分析,
library(corrplot)
## corrplot 0.84 loaded
library(RColorBrewer)
data("iris")
#round 在这里是统一小数点后几位数
<- round(cor(iris[1:4]),1)
corr head(corr)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0 -0.1 0.9 0.8
## Sepal.Width -0.1 1.0 -0.4 -0.4
## Petal.Length 0.9 -0.4 1.0 1.0
## Petal.Width 0.8 -0.4 1.0 1.0
corrplot(corr, type="full",
method = "circle",
tl.col = 'black',
tl.cex = 1,
col=brewer.pal(n=4, name="RdYlBu"),
order="hclust")
##通过?corrplot 可以查看所有的参数设置
3.10 ggplot相关图
library(ggcorrplot)
data("iris")
#round 在这里是统一小数点后几位数
<- round(cor(iris[1:4]),1)
corr head(corr)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0 -0.1 0.9 0.8
## Sepal.Width -0.1 1.0 -0.4 -0.4
## Petal.Length 0.9 -0.4 1.0 1.0
## Petal.Width 0.8 -0.4 1.0 1.0
#计算P值
<- cor_pmat(corr)
p.mat ggcorrplot(corr,
hc.order = TRUE,
lab = TRUE,
type = "full",
outline.col = "white",
p.mat = p.mat,
colors = c("#6D9EC1", "white", "#E46726"),
#你也可以选择‘circle’等hao
method = "square")
##通过?corrplot 可以查看所有的参数设置
3.11 直方图
先看一下如何用R基础方程作直方图,其中一些参数修改可以参考 plot
程序。
data("iris")
<- hist(iris$Sepal.Length)
h text(h$mids,h$counts,labels=h$counts)
3.12 ggplot直方图
data("iris")
library(reshape2)
<- as.matrix(iris[1:4])
mar_iris <- melt(mar_iris )
data_iris names(data_iris) <- c('x','y','value')
ggplot(data_iris,aes(value))+ geom_histogram()+
facet_grid(.~y,scales = 'free')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(data_iris,aes(value,color=y))+ geom_histogram(
fill="white", alpha=0.5, position="identity"
+geom_density(alpha=0.6)+
)theme(legend.position = 'bottom')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
3.13 ggplot残差图
我们也可以做残差图,这里我们介绍两种表达方式,直方残差图和线性残差图。
data("iris")
library(reshape2)
<- iris
mar_iris <- melt(mar_iris,id.vars = 'Species' )
data_iris
#直方残差图
# use se
ggplot(data_iris, aes(x = variable, y = value,fill= variable)) +
stat_summary(fun.y = mean, geom = "bar") +
stat_summary(fun.data = mean_se, fun.args = list(mult = 1), geom = "errorbar", width = 0.2)+
facet_wrap(Species~.,scales = 'free')+
theme(axis.text.x = element_text(angle = 45),
legend.position = 'bottom')
## Warning: `fun.y` is deprecated. Use `fun` instead.
# use sd
ggplot(data_iris, aes(x = variable, y = value,fill= variable)) +
stat_summary(fun.y = mean, geom = "bar") +
stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1), geom = "errorbar", width = 0.2)+
facet_wrap(Species~.,scales = 'free')+
theme(axis.text.x = element_text(angle = 45),
legend.position = 'bottom')
## Warning: `fun.y` is deprecated. Use `fun` instead.
接下来是线性残差图,用另一种计算sd
,se
和ci
值得方法。
# Calculates mean, sd, se and IC
<- data_iris %>%
my_sum group_by(Species,variable) %>%
summarise(
n=n(),
mean=mean(value),
sd=sd(value)
%>%
) mutate( se=sd/sqrt(n)) %>%
mutate( ic=se * qt((1-0.05)/2 + .5, n-1))
## `summarise()` has grouped output by 'Species'. You can override using the `.groups` argument.
# use sd
ggplot(my_sum, aes(x=variable, y=mean, group=Species,col=Species)) +
geom_line()+ geom_point()+
geom_errorbar(aes(ymin=mean-sd, ymax=mean+sd), width=.2,
position=position_dodge(.9)) +
facet_wrap(Species~.,scales = 'free')+
theme(axis.text.x = element_text(angle = 45),
legend.position = 'bottom')
# use se
ggplot(my_sum, aes(x=variable, y=mean, group=Species,col=Species)) +
geom_line()+ geom_point()+
geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.2,
position=position_dodge(.9)) +
facet_wrap(Species~.,scales = 'free')+
theme(axis.text.x = element_text(angle = 45),
legend.position = 'bottom')
3.14 ggplot 地图
ggplot 也可以用来绘制世界各个国家的地图,然后根据需求对各个国家的地理位置进行数据可视化,这里我们需要一些其他安装包来与ggplot
结合进行地图绘制。
library(maps)
# library(maptools)
library(mapproj)
library(ggplot2)
library(mapdata)
library(mapproj)
data(countyMapEnv)
<-map_data('italy')
hmap head(hmap )
## long lat group order region subregion
## 1 11.83295 46.50011 1 1 Bolzano-Bozen <NA>
## 2 11.81089 46.52784 1 2 Bolzano-Bozen <NA>
## 3 11.73068 46.51890 1 3 Bolzano-Bozen <NA>
## 4 11.69115 46.52257 1 4 Bolzano-Bozen <NA>
## 5 11.65041 46.50721 1 5 Bolzano-Bozen <NA>
## 6 11.63282 46.48045 1 6 Bolzano-Bozen <NA>
ggplot(hmap,aes(long,lat,group=group,fill=order))+geom_polygon()+
# geom_polygon(color='black')+
coord_map('polyconic')+guides(fill=F)
##中国地图
library(mapdata)
# library(maptools)
library(rgdal)
library(tidyverse)
= rgdal::readOGR ("china/bou2_4p.shp") mydat
## OGR data source with driver: ESRI Shapefile
## Source: "F:\bookdown\china\bou2_4p.shp", layer: "bou2_4p"
## with 925 features
## It has 7 fields
## Integer64 fields read as strings: BOU2_4M_ BOU2_4M_ID
names(mydat)
## [1] "AREA" "PERIMETER" "BOU2_4M_" "BOU2_4M_ID" "ADCODE93"
## [6] "ADCODE99" "NAME"
table(iconv(mydat$NAME,to = 'utf8', from = "GBK"))
##
## 安徽省 北京市 福建省 甘肃省
## 1 1 168 1
## 广东省 广西壮族自治区 贵州省 海南省
## 154 6 2 79
## 河北省 河南省 黑龙江省 湖北省
## 9 1 1 1
## 湖南省 吉林省 江苏省 江西省
## 1 1 5 1
## 辽宁省 内蒙古自治区 宁夏回族自治区 青海省
## 94 1 1 1
## 山东省 山西省 陕西省 上海市
## 86 1 1 12
## 四川省 台湾省 天津市 西藏自治区
## 1 57 1 1
## 香港特别行政区 新疆维吾尔自治区 云南省 浙江省
## 53 1 1 179
## 重庆市
## 1
<- fortify(mydat)
china %>%
china # filter(!id == '464')%>%
ggplot(aes(long,lat,group=group,fill=id))+geom_polygon()+
# geom_polygon(color='black')+
coord_map('polyconic')+guides(fill=F)+theme_classic(base_size = 16)
3.15 小结
讲到这里,我们已经基本上把R里面的数据分析与可视化的主要内容讲完了,但是值得注意的是,我讲的只是一些基础,R里面还有很多很多的可利用的数据分析能力与作图方法,读者可以在理解基本的绘图能力以后,根据自身需要,去探索更深层次更复杂的绘图。尤其是
ggplot
以及其延申的各种安装包。详情可以参考ggplot
的官方网站 ggplot2去了解更多内容。