R语言数据可视化之美 · 第8章

精读版:概念讲解 + 图 + 代码,看这一页就够了

8.1 高维数据的变换展示

一句话:降维思想:把高维数据投影到2维/3维空间并尽量保留信息。

人眼一般能感知的空间为二维和三维。高维数据可视化的重要目标就是将高维数据呈现于二维或三维空间中。高维数据变换就是使用降维度的方法,使用线性或非线性变换把高维数据投影到低维空间,去掉余属性,但同时尽可能地保留高维空间的重要信息和特征。

从具体的降维方法来分类,主要可分为线性和非线性两大类。其中,线性方法包括主成分分析(PrincipalComponentsAnalysis,PCA)多维尺度分析(MultiDimensional Scaling,MDS)、非矩阵分解(Non-negativeMatrixFactorization,NMF)等,非线性方法包括等距特征映射(IsometricFeatureMapping,IS()MAP)局部线性嵌套(Locally Linear Embedding,LLE)等[53]。

8.1.1 主成分分析法

一句话:主成分分析PCA:线性降维,方差最大的方向做主成分——16S测序样本分群标配。

主成分分析法,也被称为主分量分析法,是很常用的一种数据降维方法54。主成分分析法采用一个线性变换将数据变换到一个新的坐标系统,使得任何数据点投影到第一个坐标(成为第一主成分)的方差最大,在第二个坐标(第二主成分)的方差为第二大,以此类推。因此,主成分分析可以减少数据的维数,并保持对方差贡献最大的特征,相当于保留低阶主成分,忽略高阶主成分。

图8-1-1

所示,一组二维数据(见

图8-1-1(a)

),采用主成分分析法检测到的前两位综合指标,正好指出数据点的两个主要方向v和v(两个正交的箭头),提取的前两位综合指标,如

图8-1-1(b)

所示。(b)93维数据的train数据集技能主成分分析图R中FactoMineR包的主成分分析函数PCA()可以进行数据降维处理,使用factoextra包的fviz_pca_ind()函数可以以散点的形式展示数据分析结果,如

ch_图8-1-2_主成分分析.pngch_图8-1-2_主成分分析图.pngch_图8-1-2主成分分析图(b).png
图8-1-2
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

#-----------------------------------------------------------Method 1-----------------------------------------------------------
library(ggplot2)
library(factoextra)
library(FactoMineR)
df <- iris[c(1, 2, 3, 4)]
iris.pca<- PCA(df, graph = FALSE)
fviz_pca_ind(iris.pca,
             geom.ind = "point", # show points only (nbut not "text")
             pointsize =3,pointshape = 21,fill.ind = iris$Species, # color by groups
             palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups",
             title="")+
  theme_grey() +
  theme(
  text=element_text(size=12,face="plain",color="black"),
  axis.title=element_text(size=11,face="plain",color="black"),
  axis.text = element_text(size=10,face="plain",color="black"),
  legend.title = element_text(size=11,face="plain",color="black"),
  legend.text = element_text(size=11,face="plain",color="black"),
  legend.background = element_blank(),
  legend.position=c(0.88,0.15)
)

#----------------------------------------------------
set.seed(1)
num_rows_sample <- 5000

train        <- read.csv("Tsne_Data.csv")
train_sample <- train[sample(1:nrow(train), size = num_rows_sample),]
features     <- train_sample[,c(-1, -95)]
features.pca<- PCA(features, graph = FALSE)

fviz_pca_ind(features.pca,
             geom.ind = "point", # show points only (nbut not "text")
             pointsize =3,pointshape = 21,fill.ind = train_sample$target, # color by groups
             #palette = c("#00AFBB", "#E7B800", "#FC4E07"),
             addEllipses = TRUE, # Concentration ellipses
             legend.title = "Groups",
             title="")+
  theme_grey() +
  theme(
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=11,face="plain",color="black"),
    axis.text = element_text(size=10,face="plain",color="black"),
    legend.title = element_text(size=11,face="plain",color="black"),
    legend.text = element_text(size=11,face="plain",color="black"),
    legend.background = element_blank(),
    legend.position="right"
  )

#-----------------------------------------------------------Method 2-----------------------------------------------------------
library(ggfortify)
autoplot(prcomp(df), data = iris, 
         shape=21,colour ="black",fill= 'Species', size=3,
         frame = TRUE,frame.type = 'norm', frame.colour = 'Species')

所示,其中

四维数据的iris数据集具体代码如下所示

8.1.2 t-SNE算法

一句话:t-SNE:非线性降维,聚类结构比PCA更清晰,适合看分群。

t-SNE(t-distributedStochasticNeighborEmbedding)算法是用于降维的一种机器学习算法,由LaurensvanderMaaten和GeoffreyHinton在2008年提出来[]。t-SNE是一种用于探索高维数据的非线性降维算法,非常适用于将高维数据降维到二维或者三维,再使用散点图等基本图表进行可视化。PCA是一种线性算法,它不能解释特征之间的复杂多项式关系;而t-SNE是基于在邻域图上随机游走的概率分布来找到数据内的结构(见

ch_图8-1-3_t-SNE图.png
图8-1-3
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(Rtsne) # Load package
library(ggplot2)
library(RColorBrewer)

iris_unique <- unique(iris) # Remove duplicates
set.seed(42) # Sets seed for reproducibility
tsne_out <- Rtsne(as.matrix(iris_unique[,1:4])) # Run TSNE

mydata<-data.frame(tsne_out$Y,iris_unique$Species)
colnames(mydata)<-c("t_DistributedY1","t_DistributedY2","Group")

ggplot(data=mydata,aes(t_DistributedY1,t_DistributedY2,fill=Group))+
  geom_point(size=4,colour="black",alpha=0.7,shape=21)+
  scale_fill_manual(values=c("#00AFBB",  "#FC4E07","#E7B800","#2E9FDF"))+
  theme(
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=11,face="plain",color="black"),
    axis.text = element_text(size=10,face="plain",color="black"),
    legend.title = element_text(size=11,face="plain",color="black"),
    legend.text = element_text(size=11,face="plain",color="black"),
    legend.position=c(0.83,0.15)
  )
  

#----------------------------------------------------
set.seed(1)
num_rows_sample <- 5000

train        <- read.csv("Tsne_Data.csv")
train_sample <- train[sample(1:nrow(train), size = num_rows_sample),]
features     <- train_sample[,c(-1, -95)]

tsne <- Rtsne(as.matrix(features), check_duplicates = FALSE, pca = TRUE,
              perplexity=30, theta=0.5, dims=2)

embedding <- as.data.frame(tsne$Y)

embedding$Class<-train_sample$target

ggplot(embedding, aes(x=V1, y=V2, color=Class)) +
  geom_point(size=1.25) +
  #scale_colour_manual(values=palette(brewer.pal(8,"Set1")))
  guides(colour = guide_legend(override.aes = list(size=4))) +
  xlab("t_DistributedY1") + ylab("t_DistributedY2") +
  #ggtitle("t-SNE 2D Embedding of Products Data") +
  #theme_light(base_size=20) +
  theme(strip.background = element_blank(),
        strip.text.x     = element_blank(),
        #axis.text.x      = element_blank(),
        #axis.text.y      = element_blank(),
        #axis.ticks       = element_blank(),
        axis.line        = element_blank(),
        panel.border     = element_blank())

)。(b)93维数据的train数据集SNE通过仿射(affinitie)变换将数据点映射到概率分布上,主要包括两个步骤。(1)SNE构建一个高维对象之间的概率分布,使得相似的对象有更高的概率被选择,而不相似的对象有较低的概率被选择。

(2)SNE在低维空间里构建这些点的概率分布,使得这两个概率分布之间尽可能地相似。t-SNE作为新兴的降维算法,也并非万能。其中,t-SNE主要不足有如下几点。

(1)t-SNE倾向于保存局部特征,对于本征维数(intrinsicdimensionality)本身就很高的数据集,是不可能完整的映射到二到三维的空间。(2)t-SNE没有唯一最优解,且没有预估部分。如果想要做预估,则可以考虑在降维之后构建一个回归方程之类的模型。

但是要注意,在t-SNE中,距离本身是没有意义的,都是概率分布问题。技能t-SNE图R中的Rtsne包的Rtsne()函数可对数据进行降维处理,使用ggplot2包的geom_point()函数绘制如

所示的图表,其实现代码如下所示

8.2 分面图

一句话:分面图:三维四维数据拆成多个小图,比立体图更好读。

当我们用三维图表表示三维或者四维数据的时候,其实就已经有点不容易清晰地观察数据规律与展示数据信息,如

ch_图8-2-1_高维数据可视化1.pngch_图8-2-1_高维数据可视化2.pngch_图8-2-1_高维数据可视化3.pngch_图8-2-1_高维数据可视化_(a).pngch_图8-2-1_高维数据可视化_(b).pngch_图8-2-1_高维数据可视化_(c).png
图8-2-1
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
#library(scatterplot3d)
library(scales)
library(wesanderson)
library(RColorBrewer)
library(dplyr)
library(grid)

Alz<-read.csv("Facet_Data.csv", header = T)
df<-Alz[,c("Class","SOD","tau","age")]

#-------------------------------------------------------------Èýάɢµãͼ----------------------------------------------------
library(plot3D)
colors0 <- wes_palette(n=3, name="Darjeeling1")

df$Class_x<-as.numeric(df$Class)
colors <- colors0[df$Class_x]

pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
with(df, scatter3D(x = Class_x, y = SOD, z = tau, #bgvar = mag,
                       pch = 21, cex = 1.5,col="black",bg=colors,
                       xlab = "Class",
                       ylab = "SOD",
                       zlab = "tau",
                       labels=c(""),
                       ticktype = "detailed", bty = "f",box = TRUE,expand = 1,#cex.axis= 1e-09,
                       #panel.first = panelfirst,
                       theta = 30, phi = 20, d=5,
                       colkey = FALSE)#list(length = 0.5, width = 0.5, cex.clab = 0.75))
)


text3D(x = 1:3, y = rep(4, 3), z = rep(4.5, 3), labels = levels(df$Class), 
       add = TRUE, adj = 0, col = "black", bty = "g")

#colkey (col=colors0,clim=c(0,6),
#        at = c(1, 3, 5), labels = levels(df$Class),
#        clab = "Class", add=TRUE, width=1.5,length=0.2,side = 4)
legend("right",title =  "Species",legend=levels(df$Class),pch=21,
       cex=1,y.intersp=1,pt.bg = colors0,bg="white",bty="n")


#----------------------------------------------------ÈýÎ¬ÆøÅÝͼ------------------------------------------------------
Alz<-read.csv("Facet_Data.csv", header = T)
df<-Alz[,c("Class","SOD","tau","age")]

colors0 <- wes_palette(n=3, name="Darjeeling1")
df$Class_x<-as.numeric(df$Class)
colors <- colors0[df$Class_x]

pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
with(df, scatter3D(x = Class_x, y = SOD, z = tau, #bgvar = mag,
                   pch = 21, cex = rescale(df$age, c(.5, 3)),col="black",bg=colors,
                   xlab = "Class",
                   ylab = "SOD",
                   zlab = "tau",
                   labels=c(""),
                   ticktype = "detailed", bty = "f",box = TRUE,expand = 1,#cex.axis= 1e-09,
                   #panel.first = panelfirst,
                   theta = 30, phi = 20, d=5,
                   colkey = FALSE)#list(length = 0.5, width = 0.5, cex.clab = 0.75))
)


text3D(x = 1:3, y = rep(4, 3), z = rep(4.5, 3), labels = levels(df$Class), 
       add = TRUE, adj = 0, col = "black", bty = "g")
legend("right",title =  "Species",legend=levels(df$Class),pch=21,
       cex=1,y.intersp=1,pt.bg = colors0,bg="white",bty="n")

N<-5
breaks<-round(seq(min(df$age),max(df$age),length.out=5),3)


legend("topright",title =  "Age",legend=breaks,pch=21,
       pt.cex=rescale(breaks, c(.5, 3)),y.intersp=1,
       pt.bg = "white",bg="white",bty="n")

#colkey (col=colors0,clim=c(0,6),
#        at = c(1, 3, 5), labels = levels(df$Class),
#        clab = "Class", add=TRUE, width=1.5,length=0.2,side = 4)


#---------------------------------------------


colormap <- colorRampPalette(rev(brewer.pal(11,'RdYlGn')))(100)

index <- ceiling(((prc <- 0.7 * df$age/ diff(range(df$age))) - min(prc) + 0.3)*100)
for (i in seq(1,length(index)) ){
  prc[i]=colormap[index[i]]
}

pmar <- par(mar = c(5.1, 4.1, 4.1, 6.1))
with(df, scatter3D(x = Class_x, y = SOD, z = tau, #bgvar = mag,
                   pch = 21, cex = rescale(df$age, c(.5, 3)),col="black",bg=prc,#colors,
                   xlab = "Class",
                   ylab = "SOD",
                   zlab = "tau",
                   labels=c(""),
                   ticktype = "detailed", bty = "f",box = TRUE,expand = 1,#cex.axis= 1e-09,
                   #panel.first = panelfirst,
                   theta = 30, phi = 20, d=5,
                   colkey = FALSE)#list(length = 0.5, width = 0.5, cex.clab = 0.75))
)


text3D(x = 1:3, y = rep(4, 3), z = rep(4.5, 3), labels = levels(df$Class), 
       add = TRUE, adj = 0, col = "black", bty = "g")
#colkey (col=colormap,clim=range(df$age),clab = "Age", add=TRUE, length=0.45,side = 4)

N<-5
breaks<-round(seq(min(df$age),max(df$age),length.out=5),3)

legend_index <- ceiling(((legend_prc <- 0.7 *breaks/ diff(range(breaks))) - min(legend_prc) + 0.3)*100)
for (i in seq(1,length(legend_index)) ){
  if (legend_index[i]>100){
    legend_index[i]<-100
  }
  legend_prc[i]=colormap[legend_index[i]]
}
legend("right",title =  "Age",legend=breaks,pch=21,
       pt.cex=rescale(breaks, c(.5, 3)),y.intersp=1,
       pt.bg = legend_prc,bg="white",bty="n")

所示。其中

以三维散点图的形式,展示了三维数据信息tau、SOD和Class(Control、Impaired和Uncertain);

(a)的基础上,以气泡的形式再添加了一维数据变量Age,总共展示了四维数据信息。但是此时,已经很难观察数据的变化关系。所以,可以引入分面图的形式展示数据。

0.98300.9856.56.06.05.55.08-2-1高维数据可视化R中的ggplot2包有两个很有意思的函数:facet_wrap()和facetgrid(),这两个函数可以根据类别属性绘制一些系列子图,类似于邮票图(smallmultiples),其大致可以被分为:矩阵分面图(图8-2-4所示的矩阵分面气泡图)行分面图(图4-7-2所示的行分面的带填充的曲线图)列分面图(图8-2-2所示的列分面的散点图和如

ch_图8-2-3_列分面的气泡图.png
图8-2-3

所示的列分面的气泡图)。其他分面图,比如树形分面图、圆形分面图等。分面图就是根据数据类别按行或者列,使用散点图、气泡图、柱形图或者曲线图等基础图表展示数据,揭示数据之间的关系,可以适用于四到五维的数据结构类型。

这两个函数的具体讲解如下:facet_grid(rows=NULL,cols =NULL,scales=“fixed" labeller=“label_value",facets)facet_wrap(facets,nrow=NULl,labeller=“label _value",strip_position=“top")其中,rows表示要进行行分面的变量,如rows=vars(drv)表示将变量drv作为维度进行行分面,可以使用多个分类变量:cols表示要进行列分面的变量,如cols=vars(drv)表示将变量drv作为维度进行列分面,可以使用多个分类变量;scales表示分面后的坐标轴适应规则,其中,“free"表示x轴和Y轴调整,“freex"表示X轴调整,“freey"表示Y轴坐标轴调整,“fixed”表示X轴和Y轴的取值范围统一:facets表示将哪些变量作为维度进行分面,在网格分面中,尽量不使用facets,而使用rows和cols。ggplot2分面系统的说明如表8-2-1所示

ch_图8-2-2_列分面的散点图.png
图8-2-2
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
library(RColorBrewer)  
library(reshape2)
library(wesanderson)


Alz <-read.csv("Facet_Data.csv", header = T)

#-----------------------------------图8-2-1 列分面的散点图(a) 列分面的散点图--------------------------------------------------
ggplot(Alz, aes(x = tau, y = SOD, fill = Class)) +
  geom_point(size=3,shape=21,colour="black") +
  # stat_smooth(method = "loess")+
  facet_wrap( ~ Class) +
  theme(
    strip.text = element_text(size=13,face="plain",color="black"),
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=14,face="plain",color="black"),
    axis.text = element_text(size=11,face="plain",color="black"),
    legend.position="none"
  )

#-----------------------------------图8-2-1 列分面的散点图 (b) 列分面的带拟合曲线的散点图-------------------------------------------------------------------
ggplot(Alz, aes(x = tau, y = SOD,colour=Class, fill = Class)) +
  geom_point(size=2,shape=21,fill="black",colour="black",alpha=0.5) +
  stat_smooth(method = "loess")+
  facet_grid(. ~ Class) +
  theme(
    strip.text = element_text(size=13,face="plain",color="black"),
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=14,face="plain",color="black"),
    axis.text = element_text(size=11,face="plain",color="black"),
    legend.position="none"
  )

#---------------------------------------图8-2-2 列分面的气泡图(a) 列分面的气泡图-----------------------------------------------------------------------------------
ggplot(Alz, aes(x = tau, y = SOD, fill= Class, size = age)) +
  geom_point(shape=21,colour="black",alpha=0.7) +
  facet_wrap( ~ Class)+
  guides(fill = FALSE)+
  theme(
    strip.text = element_text(size=13,face="plain",color="black"),
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=14,face="plain",color="black"),
    axis.text = element_text(size=11,face="plain",color="black"),
    legend.position=c(0.935,0.13),
    legend.background = element_rect(fill=alpha("white",0))
  )

#----------------------------------------图8-2-2 列分面的气泡图 (b) 列分面的带颜色映射的气泡图----------------------------------------------------------------------------
ggplot(Alz, aes(x = tau, y = SOD, fill=age, size = age)) +
  geom_point(shape=21,colour="black",alpha=0.95) +
  
  scale_fill_gradient2(low="#00A08A",mid="white",high="#FF0000",midpoint = mean(Alz$age))+
  facet_wrap( ~ Class)+
  #guides(fill = FALSE)+
  theme(
    strip.text = element_text(size=13,face="plain",color="black"),
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=14,face="plain",color="black"),
    axis.text = element_text(size=11,face="plain",color="black"),
    #legend.position=c(0.935,0.13),
    legend.background = element_rect(fill=alpha("white",0))
  )

#-----------------------------------------图8-2-3 矩阵分面气泡图--------------------------------------------------------------------------
Alz$male<-as.character(Alz$male)
Alz$male[Alz$male=="0"] <- "Female"
Alz$male[Alz$male=="1"] <- "Male"
colnames(Alz)[colnames(Alz)=="male"]<-"Gender"
ggplot(Alz, aes(x = tau, y = SOD, fill= Class, size = age)) +
  geom_point(shape=21,colour="black",alpha=0.7) +
  facet_grid(Gender ~ Class)+
  guides(fill = FALSE)+
  theme(
    strip.text = element_text(size=13,face="plain",color="black"),
    text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=14,face="plain",color="black"),
    axis.text = element_text(size=11,face="plain",color="black"),
    legend.position=c(0.935,0.11),
    legend.background = element_rect(fill=alpha("white",0))
  )

为列分面的散点图,

为三维数据,分别为tau、SOD和Class(Control、Impaired和Uncertain)。该数据也可以使用三维散点图绘制,将数据系列根据Class类别,将散点数据绘制在三个平面。但是由于数据的遮挡,这样并不能很好地展示数据,从而影响读者对数据的观察。

图8-2-2(a)就能清晰地展示不同类别下变量SOD和tau的关系。在这个基础上,也可以通过stat_smooth(method=“loess")语句,从而添加LOESS平滑拟合曲线,如

所示。455.05.5606570455.05560:65704.55.055606.5704.550556.0657.045505.56.065704.55.05.5606570(b)列分面的带拟合曲线的散点图

为列分面的气泡图,展示的是四维数据,分别为tau、SOD、Class(Control、Impaired和Uncertain)和age。其中,平时使用气泡图可以展示三维数据,第一维和第二维数据分别对应X轴和Y轴坐标,气泡大小对应第三维数据。使用列分面的气泡图可以通过列分面对应第四维数据。

是使用不同颜色区分变量Class,

使用带颜色映射的气泡图,变量Class可以通过分面上方的标题区分。5.55.000.9840.9880.9861.50.9880.98404.5505560657.045505.56.065704.5505.56.06.570455.0556.06570:4.55.0556.06.5704.5505.5606.570(b)列分面的带颜色映射的气泡图

ch_图8-2-4_矩阵分面的气泡图.png
图8-2-4

为矩阵分面的气泡图,展示的是五维数据,分别为tau、SOD、Class(Control、Impaired和Uncertain)age和Gender(Male和Female)。气泡图可以对应展示前三维的数据,使用矩阵分面的气泡图可以通过行分面和列分面对应第四维和第五维数据。所以,矩阵分面的气泡图可以很好地展示五维数据,其中三维为连续数据,二维为离散数据。

5.55.00.9860.9884.55.0556.06.57.0455.05.56.0657.04.55.0556.06.57.0技能列分面气泡图R中的ggplot2包提供的facet_wrap()函数,可以绘制如8-2-3(a)所示列分面的气泡图,其核心代码如下所示,其中颜色主题方案为wesanderson包的Darjeeling

所示的矩阵分面的气泡图,其核心代码如下所示,其中颜色主题方案为wesanderson包的Darjeeling

8.3 矩阵散点图

一句话:矩阵散点图:每两个变量画一个散点组成矩阵,变量间关系一目了然。

矩阵散点图(scatterplotmatrix)是散点图的高维扩展,它是一种常用的高维度数据可视化技术。它将高维度的数据每两个变量组成一个散点图,再将它们按照一定的顺序组成矩阵散点图。通过这样的可视化方式,能够将高维度数据中所有的变量两两之间的关系展示出来。

它从一定程度上克服了在平面上展示高维度数据的困难,在展示多维数据的两两关系时有着不可替代的作用。以统计学中经典的鸢尾花(anderson’sirisdataset)案例为例,其数据集包含了50个样本,都属于鸢尾花属下的三个亚属,分别是山鸢尾、变色鸢尾和弗吉尼亚鸢尾(setosa、versicolor和virginica)。四个特征被用作样本的定量分析,它们分别是花萼和花瓣的长度和宽度(sepalswidth、sepalsheight、petalswidth和petalsheight)。

ch_图8-3-1_矩阵散点图.png
图8-3-1
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
library(GGally)
library(RColorBrewer) 

#library(devtools)
#install_github("ggobi/ggally")
#-------------------------------图7-3-1 矩阵散点图(a)单数据系列 ----------------------------------------------

lowerFn <- function(data, mapping, method = "loess", ...) {
  p <- ggplot(data = data, mapping = mapping) +
    geom_point(size=1)+#colour = "blue") +
    geom_smooth(method = method, color = "red", ...)+
    theme(panel.background = element_rect(fill = "white", colour = "grey20"))
  p
}

diagFn <- function(data, mapping, method = "loess", ...) {
  p <- ggplot(data = data, mapping = mapping) +
    geom_histogram(colour = "black",size=0.1)+#) 
    #geom_smooth(method = method, color = "red", ...)+
    theme(panel.background = element_rect(fill = "white", colour = "grey20"))
  p
}

ggpairs(df, 
  lower = list(continuous = wrap(lowerFn, method = "lm")),
  diag = list(continuous = wrap(diagFn)),#"barDiag", colour = "black")),
  upper = list(continuous = wrap("cor", size = 4,color="black", alignPercent = 0.9)))+
  theme_bw()+ 
  theme(panel.grid.major = element_blank(),
                    panel.grid.minor = element_blank(),
                    panel.border = element_rect( colour = "black", fill = NA,size=0.25),
                    axis.title=element_text(size=8,face="plain",color="grey30"),
                    axis.text = element_text(size=8,face="plain",color="grey30"),
                    strip.background = element_blank())


#---------------------------------图7-3-1 矩阵散点图(b)多数据系列 -------------------------

library(wesanderson)
ggpairs_theme <- theme_bw()+theme(panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                panel.border = element_rect( colour = "black", fill = NA,size=0.25),
                axis.title=element_text(size=8,face="plain",color="grey30"),
                axis.text = element_text(size=8,face="plain",color="grey30"),
                strip.background = element_blank())


ggplot <- function(...) ggplot2::ggplot(...) + scale_fill_manual(values=wes_palette(n=3, name="Darjeeling1"))+
  scale_color_manual(values=wes_palette(n=3, name="Darjeeling1"))
#ggplot<-function(...) ggplot2::ggplot(...) + scale_colour_brewer(palette="Set1")
unlockBinding("ggplot",parent.env(asNamespace("GGally")))
assign("ggplot",ggplot,parent.env(asNamespace("GGally")))

ggpairs(iris, columns =1:4, mapping = ggplot2::aes(fill = Species,colour=Species),
  lower=list(continuous = wrap("points",size=1,shape=21)),#,colour="black"
  diag = list(continuous = wrap("densityDiag",alpha=0.5,colour="black",size=0.25)),
  upper= list(continuous = wrap("cor",size = 3, alignPercent = 0.9)))+
  ggpairs_theme

用矩阵散点图展示了鸢尾花数据集。

为单数据系列的矩阵散点图,由于子图表较多,这里将网格线删除以突出数据部分图表。下半部分展示带线性拟合的两个变量散点图,中间对角线部分展示一个变量的统计直方图,上半部分展示两个变量之间的相关系数。这样的矩阵散点图能全面地展示数据分析结果,包括两个变量之间的相关系数、带线性拟合的散点图和单个变量的统计直方图。

其中,中间对角线部分也展示一个变量的核密度估计曲线图,如

所示。矩阵散点图的主要优点是能够直观解释所有的任意二维数据之间的关系,而不受数据集大小和维数多少的影响:缺点是当维数增加时,矩阵会受到屏幕大小的限制,而且它只能够发现两个维数据之间的关系,很难发现多个数据维之间的关系。12.510.07.55.00.8720.8182.50.04.54.00.963202530354.04.50.80.40.04.54.03.53.01.51.00.50.0240IR语言数据可视化之美:专业图表绘制指南技能矩阵散点图R中graphics包的pairs()函数可以绘制矩阵散点图,但是推荐使用GGally包的ggpairs()函数实现

所示的矩阵散点图,其核心代码如下所示。使用ggpairs()函数绘制矩阵散点图的一个很大的优势是可以通过语句控制上下和对角线部分展示的图表类型,比如是否使用回归拟合等。#设置矩阵散点图的背景风格ggpairs_theme<-theme_bw()+theme(panel.grid.major=element_blankO.#删除主要网格线panel.grid.minor=element_blankO.#删除次要网格线panel.border =element_rect(colour=“black",fill=NA.size=0.25)#使用无填充、0.25磅黑色边框的方格axis.title=element_text(size=8.face=“plain",color="grey30").axis.text=element_text(size=8,face="plain",color="grey30").strip.background=element_blank())#修改GGally包的默认颜色主题方案为wesanderson包的Darjeelingscale_color_manual(values=wes_palette(n=3,name="Darjeeling")#使用ggpairs绘制矩阵散点图diag=list(continuous =wrap(“densityDiagalpha=0.5,colour=“black"size=0.25))#对角线部分绘制核密度曲线图upper=list(continuous=wrap(cor"size=3.alignPercent=0.9))+#上半部分显示相关系数数值

8.4 热力图

一句话:热力图:数据矩阵映射为颜色,样本×变量全貌,常配聚类。

热力图(heatmap)是一种将规则化矩阵数据转换成颜色色调的常用的可视化方法,其中每个单元对应数据的某些属性,属性的值通过颜色映射转换为不同色调并填充规则单元。在

ch_图8-4-1_热力图.pngch_图8-4-1_热力图2.png
图8-4-1
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

#--------------------------------------------图7-4-1 热力图 方法1---------------------------------------------------
library(ComplexHeatmap)
library(circlize)
library(dendextend)

df<-scale(mtcars) #使用scale方法来对数据进行标准化,以消除量纲对数据结构的影响
row_dend = hclust(dist(df))   # 根据行对数据进行系统性聚类
col_dend = hclust(dist(t(df)))  # 根据列对数据进行系统性聚类
mycol <-rev(brewer.pal(n = 7, name = "RdYlBu")) #构造颜色映射方案
Heatmap(df, col = mycol,name = "mtcars",rect_gp = gpar(col = "black"),
        column_dend_height = unit(4, "cm"), #设定列聚类显示部分的高度
        row_dend_width = unit(4, "cm"),    #设定行聚类显示部分的宽度
        cluster_rows = color_branches(row_dend, k = 4), #设定行聚类成4类
        cluster_columns = color_branches(col_dend, k = 2)) #设定列聚类成2类


#------------------------------------------图7-4-1 热力图 方法2-----------------------------------------------------
library(gplots)
colormap <- colorRampPalette(rev(brewer.pal(n = 7, name = "RdYlBu")))(100)

# order for rows
Rowv  <- mtcars %>% scale %>% dist %>% hclust %>% as.dendrogram %>%
  set("branches_k_color", k = 4) %>% set("branches_lwd", 1.2) %>%
  ladderize

# Order for columns
Colv  <- mtcars %>% scale %>% t %>% dist %>% hclust %>% as.dendrogram %>%
  set("branches_k_color", k = 2, value = c("orange", "blue")) %>%
  set("branches_lwd", 1.2) %>%
  ladderize

heatmap.2(scale(mtcars), scale = "none", col = colormap,
          Rowv = Rowv, Colv = Colv,
          trace = "none", density.info = "none")


#-----------------------------------图7-4-1 热力图:方法3------------------------------------------------
library(RColorBrewer)
library(pheatmap)
colormap <- colorRampPalette(rev(brewer.pal(n = 7, name = "RdYlBu")))(100)

breaks = seq(min(unlist(c(df))), max(unlist(c(df))), length.out=100)
pheatmap(df, color=colormap, breaks=breaks,border_color="black",
         cutree_col = 2,cutree_row = 4)

中使用层次聚类分析方法结合热力图展示了数据的内在规律。表格坐标的排列和顺序都是可以通过参数控制的,合适的坐标排列和顺序可以很好地帮助读者发现数据的不同性质,例如,行和列的顺序可以帮助排列数据形成不同聚类结果。技能热力图R中gplots包的heatmap.2O函数、Complexheatmap包的heatmap()函数、pheatmap包的pheatmap()函数都可以绘制热力图。

其中使用R中pheatmap包的pheatmap()函数可以实现

所示的热力图,其核心代码如下所示。breaks =seq(min(unlist(c(df).max(unlist(c(df)).length.out=100)df<-scale(mtcars)#使用scale方法来对数据进行标准化,以消除量纲对数据结构的影响cutree_col=2.#设定列聚类成2类cutree_row=4)#设定行聚类成4类有时候,我们还会遇到共享图例的多个热力图的情况,如

ch_图8-4-2_共享图例的多个热力图.png
图8-4-2
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(RColorBrewer)
library(pheatmap)
library(cowplot)
set.seed(12345)
df1<- data.frame(matrix(rnorm(100,10,3), ncol=10))
colnames(df1) <-LETTERS[1:10]
rownames(df1) <- letters[1:10]

df2<- data.frame(matrix(rnorm(100,15,5), ncol=10))
colnames(df2) <-LETTERS[1:10]
rownames(df2) <- letters[1:10]

Colormap <- colorRampPalette(rev(brewer.pal(n = 7, name = "RdYlBu")))(100)

breaks <- seq(min(unlist(c(df1, df2))), max(unlist(c(df1, df2))), length.out=100)

p1<- pheatmap(df1, color=Colormap, breaks=breaks,border_color="black",legend=TRUE)
p2 <- pheatmap(df2, color=Colormap, breaks=breaks,border_color="black",legend=TRUE)

plot_grid( p1$gtable, p2$gtable,align = 'vh',labels = c("A", "B"),ncol = 2)

所示。A和B两个热力图的图例colorbar的颜色映射和数值范围都是相同的。1https://www.plob.org/article/10156.html技能共享图例的多个热力图R中cowplot包的plot_grid()函数可以实现多个pheatmap()函数绘制的热力图的排布与组合,并可以实现图例的legend的共享,如

所示。cowplot包主要用于多个图表的组合排列,以及图例的共享等

8.5 平行坐标系图

一句话:平行坐标系:多个平行轴画折线,每线一个样本,看多变量关系。

平行坐标系图(parallelcoordinateschart)是一种用来呈现多变量,或者高维度数据的可视化技术,用它可以很好地呈现多个变量之间的关系。平行坐标系由AlfredInselberg在1985年提出并在他以后的工作中进行了发展57.58。1990年,E.J.Wegman提出使用平行坐标系进行数据探索性分析和数据可视化设计。

为了克服传统的笛卡儿直角坐标系容易耗尽空间、难以表达三维以上数据的问题,平行坐标系将多维数据属性空间通过条等距离的平行轴映射到二维平面上,每一条轴线代表一个属性维,轴线上的取值范围从对应属性的最小值到最大值均匀分布。这样,每一个数据项都可以依据其属性取值而用一条跨越条平行轴的折线段表示,相似的对象就具有相似的折线走向趋势。所以平行坐标系图的实质是将维欧式空间的一个点X(xi,x2,,xm)映射到维平面上的一条曲线,这样就可以展示高维度的数据,具体原理如下所示。

平行坐标系在具有xy笛卡儿坐标系的平面上有N个数据点,其X轴坐标标记为x1,x2,xn;Y轴坐标标记为y,y2,yn将笛卡儿坐标系下的数据点,根据X、Y轴数值映射到平行坐标系下,并使用直线连接,如

图8-5-1

所示。以此类推到多维数据,将维数据属性空间通过条等距离的平行轴映射到二维平面上,每一条轴线代表一个属性维。圈圈的包络线重点显示了平行坐标系中椭圆双曲线的对偶性6。

平行坐标系的一个显著优点是其具有良好的数学基础,其射影几何解释和对偶特性使它很适合用于可视化数据分析。当大的数据集应用平行坐标系的表示方式时,大量的折线重叠在背景之上,造成视觉上的信息混淆,这对我们观察数据的内在模式是很不利的。所以,一般会设置折线的透明度(alphaofline),这样就可以解决这个问题,如

ch_图8-5-3_平行坐标系图.png
图8-5-3
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(GGally)

dlarge <-read.csv("Parallel_Coordinates_Data.csv", header=TRUE,check.names=FALSE)


dlarge<-transform(dlarge, Class=ifelse(reading> 523, "Class1", "Class2"))

ggparcoord(data = dlarge, columns = 1:6, mapping=aes(color=Class),#groupColumn = 5, order = "anyClass",
           groupColumn=7,#"cut",
           showPoints = FALSE, boxplot = FALSE,#title = "Parallel Coordinate Plot for the Iris Data",
           alphaLines = 0.7)+#,,splineFactor =TRUE
  scale_x_discrete(position = "top")+
  scale_colour_manual(values=c("#90C539","#45BFFC" ))+
  xlab("")+
  theme_minimal()+
  theme(
    #strip.text = element_text(size=13,face="plain",color="black"),
    #text=element_text(size=12,face="plain",color="black"),
    axis.title=element_text(size=15,face="plain",color="black"),
    axis.text = element_text(size=10,face="plain",color="black"),
    panel.grid.major.y=element_blank(),
    panel.grid.minor.y=element_blank(),
    panel.grid.major.x=element_line(size=1),
    legend.text  = element_text(size=11,face="plain",color="black"),
    legend.title =element_blank(),
    #legend.position = "right",
    axis.line.y=element_line(size=1,colour="grey70"),
    axis.ticks.y=element_line(size=1,colour="grey70"),
    legend.position=c(0.82,0.1)
    #legend.background = element_rect(fill=alpha("white",0))
  )

分别展示了单数据系列和多数据系列的平行坐标系图。

图8-5-2

笛卡儿坐标系(上)与平行坐标系(下)的对应关系平行坐标系图的优点是表达数据关系非常直观,易于理解。缺点是在表达维数决定于屏幕的水平宽度时,当维数增加时,引起垂直轴靠近,辨认数据的结构和关系稍显困难;对大数据集进行可视化时,由于折线密度增加产生大量交叠线,难以辨识;坐标之间的依赖关系很强,平行轴的安排序列性也是影响发现数据之间关系的重要因素。对于平行坐标系图,由于数据太多、线条会比较凌乱,所以推荐使用简洁的背景风格,只保留主要的图表元素,比如坐标轴及坐标轴标题,如

所示。writingpercentgraduatespupilstaffdropoutratwriting percent graduates pupilstaff技能平行坐标系图使用R中GGally包的ggparcoord()函数可以实现

的多数据系列平行坐标系图,其核心代码如下所示。其中,如果boxplot=TRUE,这样会绘制每个属性维度下的箱形图,也可以在线绘制平行坐标系图

8.6 RadViz图

一句话:RadViz图:多维点非线性映射到圆内平面,看样本分群。

将一系列多维空间的点通过非线性方法映射到二维空间,实现平面中多维数据可视化的一种数据分析方法[6],如

ch_图8-6-1_RadViz图.png
图8-6-1
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

#Reference: https://cran.r-project.org/web/packages/Radviz/vignettes/single_cell_projections.html

#--------------------------图7-6-1 Radviz图 (b)多数据系列----------------------------------
library(ggplot2)
library(wesanderson)
library(Radviz)

data(iris)
das <- c('Sepal.Length','Sepal.Width','Petal.Length','Petal.Width')
S <- make.S(das)
scaled <- apply(iris[,das],2,do.L)
rv <- do.radviz(scaled,S)

sim.mat <- cosine(scaled)
in.da(S,sim.mat) 
new <- do.optim(S,sim.mat,iter=10,n=100)
new.S <- make.S(get.optim(new))
new.rv <- do.radviz(scaled,new.S)

pop.cols <- setNames(c(wes_palette(n=3, name="Darjeeling1")),levels(iris$Species))

p<-bubbleRadviz(new.rv,
                bubble.color=c(wes_palette(n=3, name="Darjeeling1"))
                [as.integer(iris$Species)],
                bubble.fg='black',
                scale=0.05,
                decreasing=TRUE
)

# prepare "circle data"
radius <- 0.95
theta <- seq(0, 2 * pi, length = 200)
p<-p+lines(x = radius * cos(theta), y = radius * sin(theta))

legend( "bottomright",
          legend=names(pop.cols),
            col=pop.cols,
            cex=1,
            pch=15,
            bty='n')

p

#--------------------------图7-6-1 Radviz图 (a)高密度单数据系列----------------------------------
library(bodenmiller)
data(refPhenoMat)
data(refFuncMat)
refMat <- cbind(refPhenoMat,refFuncMat)
norm <- apply(refMat,2,do.L,fun=function(x) quantile(x,c(0.025,0.975)))
ct.S <- make.S(dimnames(refPhenoMat)[[2]])
## 计算相关系数矩阵
ct.sim <- cosine(norm)
## radviz-independent投影效率测量方法 
in.da(ct.S,ct.sim)
## radviz-independent投影效率测量方法 
rv.da(ct.S,ct.sim)
ct.rv <- do.radviz(norm,ct.S)

p<-smoothRadviz(ct.rv)
radius <- 0.95
theta <- seq(0, 2 * pi, length = 200)

p<-p+lines(x = radius * cos(theta), y = radius * sin(theta))

所示。RadViz图是基于弹簧张力最小化算法。它将所有属性均匀地分布在整个圆周上,然后使用弹簧模型将多维数据投影到这个二维圆中,具体原理如下所示。

RadViz模型RadViz模型是把行维数据,具体化为n个弹簧,每个弹簧代表一维属性,这n个弹簧均匀分布在一个圆周上。例如对于任意一条记录R=(A1,A2,An),归一化后的记录为R=(k,k,…,km),将其中第i维属性的值k,作为第i维弹簧的弹性系数,弹簧的一端连接在圆周上,另一端连接在多维数据。在这二维图形中的投影点上,将这n维属性的弹簧分别连接后,合力为零的点即为投影点。

将所有记录均按照以上方法投影,则示意即可实现对数据的可视化,以四维数据为例,原理如

图8-6-2

所示。RadViz图的优点是计算复杂度低,表达数据关系非常简单、直观、易于理解,而且可显示的维度大,相似多维对象的投影点十分接近,容易发现聚类信息。但是海量信息对象投影点的交叠问题严重,如(0,0,.…,0)与(aa,"a)的投影点一样。

246IR语言数据可视化之美:专业图表绘制指南技能RadViz图使用R中Radviz包的bubbleRadviz()函数可以实现

所示的多数据系列RadViz图,但是还需要前期较多的数据处理,其核心代码如下所示。Radviz包还提供了RadViz气泡图函数bubbleRadviz()、等高线图函数contour()等

8.7 图标法

一句话:图标法:图标的多个可视特征各表达一维数据。

图标法(glyph)就是使用具有多个可视特征的图标来表达多维信息,图标的每一个可视特征都可用来表示多维信息的一维,其适用于维数不多但是某些维含有特别的含义并且在二维平面上具有良好展开属性的数据集,用户可以根据图标的显示更准确地理解这些维的意义。图标可视化的优点在于使用一个图标可以表达很多变量值,其设计相对比较灵活。但是由于一个视觉空间只能排放一定数目的图标,从而限制了图标可视化的分辨率;图标法在数据的确定性方面也有一定的限制,需要用户花费一定的精力解读数据。

图8-7-1

所示的三种多变量的图标:柱形图(barglyph)星形图(starGLYPH)和饼图(pieglyph)。其中,柱形图直接将变量映射到长度,最容易比较变量之间的大小关系:星形图是将变量映射到不同方向上的长度,相对来说,可辨识程度次之;饼图是最难判定变量的关系,仅仅将变量映射到角度[62]。本节会重点介绍柱形图、星形图和切尔诺夫脸谱图三种类型图标法的绘制方法。

图8-7-1

包含五种经济指标的数据集的图标可视化,从上往下分别为:柱形图、星形图和饼图

8.7.1 基于星形图的图标法

一句话:星形图:每个属性映射到星形的一条轴,多变量小图对比。

星形图(starglyph)是Chambers于1983年首次提出的一种显示多维数据的可视化方法,这种方法使用非文字传达信息的符号(glyph)对对象编码来显示多维数据[63]。更明确地说,对象的每个属性映射到Glyph的一个特征,使得属性的值决定特征的准确性质。这样,用户扫一眼就可辨别两个对象的差异。

该方法对每个属性使用一个坐标轴,这些坐标轴一个中心点向四周辐射,就像车轮的辐条,均匀地散开。通常,所有的属性值都映像到[0,1]区间中。星形图绘制方法的主要原理是使用如下过程将对象映射到星形坐标系:将对象的每个属性值转换成一个分数,代表它在该属性的最大值和最小值之间的距离,把这个分数映射到对应于该属性的坐标上的点,再将每个点用线段连接到相邻坐标轴上的点,形成一个星状,星状的大小和形状提供了对象属性值的视觉描述。

为了便于解释,每个对象都使用单独的坐标系,换句话说,每个对象映射成一个多边形。R中graphics包的stars()函数可以绘制星形图和散点星形图,如

ch_图8-7-3_基于星形图的图标法.png
图8-7-3
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

#------------------------------------图 7-7-3 星形图-----------------------------
library(graphics)
library(RColorBrewer)
library(dplyr)
library(ggplot2)
data(diamonds)
dstar<- sample_n(diamonds, 100)
dstar$log10carat <- log10(dstar$carat)
dstar$log10price <- log10(dstar$price)
dstar<-dstar[order(dstar$cut,decreasing=T),]
#星形图
stars(dstar[,2:6], key.loc = c(-2, 10), scale = TRUE, 
      locations = NULL, len =1, radius = TRUE,
      full = TRUE, labels = NULL,draw.segments = TRUE,
      col.segments=palette(brewer.pal(7,"Set1"))[1:5])


#--------------------------------图 7-7-4 散点星形图----------------------------------------------

loc <- data.matrix(dstar[,11:12])
stars(dstar[,2:6], key.loc = c(-1, 3), scale = TRUE, 
      locations = loc, len =0.07, radius = TRUE,
      full = TRUE, labels = NULL,  draw.segments = TRUE,
      col.segments=palette(brewer.pal(7,"Set1"))[1:5],
      frame.plot=TRUE,axes = TRUE, 
      xlab="log10(carat)", ylab="log10price",
      xlim=c(-0.7,0.7))

ch_图8-7-4_散点星形图.png
图8-7-4

所示,其中可供选择的星形符号如

ch_图8-7-2_stars(函数可供选择的星形图标类型.png
图8-7-2

所示。在

散点星形图中,X轴和Y轴分布对应log10(carat)和log10(price)两个变量的数据。3.53.00.00.5技能基于星形图的图标法借助R中graphics包的stars()函数可以实现

所示图表,其核心代码如下所示

8.7.2 基于柱形图的图标法

一句话:柱形图标法:变量映射为柱长,最容易比较大小。

基于柱形图的图标法(barglyph或者profileglyph)是直接将变量映射到长度,是最容易比较变量之间的大小关系64。这个跟星形图类似,只是数据变量的映射方法有所不同。如

ch_图8-7-5_基于柱形图的图标法.png
图8-7-5
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
library(dplyr)
library(reshape2)
library(RColorBrewer)

data(diamonds)
dsmall <- sample_n(diamonds, 500)
mydata <- data.frame(dsmall[1:100,2:6])

-------------------------------------------------------------
for (i in 1:ncol(mydata))
{
  if (sum(as.integer(class(mydata[,i])=="factor")))
  {
    levels(mydata[,i]) <- seq(0,length(levels(mydata[,i]))-1,1)
    mydata[,i]<-as.numeric(mydata[,i])
  }
  temp<-mydata[,i]
  Dmin<-min(temp)
  Dmax<-max(temp)
  mydata[,i]<-(temp-Dmin)/(Dmax-Dmin)
}


mydata<-mydata[order(mydata$cut,decreasing=T),] #按照第4列降序排序

mydata$category<-as.integer(seq(1,nrow(mydata),1))

Meltdata <- melt(mydata, id.vars="category")

ggplot(Meltdata, aes(variable,value,fill=variable)) + 
  geom_bar(stat="identity",colour="black",size=0.25,width=1.0)+
  scale_fill_manual(values=brewer.pal(7,"Set1")[1:5])+
  facet_wrap(~category)+
      #theme_classic()+
      theme(#legend.position = "none",
            panel.background = element_rect(fill = "grey95"),
            axis.text = element_blank(),
            axis.title = element_blank(),
            axis.line =element_blank(),
            axis.ticks=element_blank(),
            strip.background = element_blank(), 
            strip.text = element_text(color="white"),
            strip.placement = "outside",
            #plot.margin = margin(2, 2, 2, 2, "cm"),
            plot.background = element_rect(
              fill = "white",
              colour = "white",
              size = 1)
            )

所示为柱形图的图标可视化。柱形图并不适应于展示维数太高的数据。因为柱形基于水平线排列,很难单独从柱形图中区分一个变量的趋势或者异常数据,但是通过颜色区别变量类别,可以在一定程度上解决这种问题。

技能基于柱形图的图标法借助R中ggplot2包的行列分面facet_wrap可以实现绘制

图表,其核心代码如下所示,详细的图表背景设置代码请见附件。前期的数据处理主要包括:①将factor类型的变量数据转换成numeric数值型的数据:②将数据再归一化处理到[0,1]区间中

8.7.3 切尔诺夫脸谱图

一句话:切尔诺夫脸谱图:脸的部位代表不同属性——人脑擅长看脸。

同属性,如

图8-7-6

所示为美国各州的犯罪类型的数据变量。例如脸的形状、高度和宽度、眼的高度和宽度等都可以代表不同的属性。人类的视觉和大脑擅长人脸识别,能够观察脸部的细微变化。

人对脸部的各个部位特征的感知度不同,根据属性的优先级选择人脸的映射部位。脸的形状眼的高度眼的宽度脸的高度嘴的高度脸的宽度嘴的宽度8-7-6切尔诺夫脸谱图的变量对应

ch_图8-7-7_美国各州的犯罪类型的切尔诺夫脸谱图.png
图8-7-7
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(aplpack)
library(RColorBrewer)
crime <- read.csv("Faces_Data.csv")
crime_filled <- cbind(crime[,1:6], rep(0, length(crime$state)), crime[,7:8])
crime_filled<-crime_filled[order(crime_filled$murder,decreasing=T),] 
faces(crime_filled[,2:8],
      col.face = colorRampPalette(brewer.pal(9, "Reds"))(20), 
      col.hair= colorRampPalette(brewer.pal(9, "Blues"))(20),
      labels= crime_filled$state,
      cex=1)

展示了美国各州的犯罪类型的切尔诺夫脸谱图,同时将脸的大小和头发的多少映射到渐变颜色。可以很明显地观察到:DistrictofColumbia和Alaska两个州的脸部颜色和大小尤为显著,说明DistrictofColumbia的谋杀(murder)的犯罪情况尤为多,而Alaska的强奸(forciblerape)的犯罪情况尤为多。District ofColumbia Louisiana技能切尔诺夫脸谱图借助R中aplpack包的faces()函数可以实现

所示的切尔诺夫脸谱图。只是在绘制图表前,要先根据其中一项重要的指标对数据集排序后再展示。crime <-read.csv("Faces_Data.csv")crime_filled<-crime_filled[order(crime_filled$murder,decreasing=T)]col.face =colorRampPalette(brewer.pal(9,“Reds")(20),col.hair=colorRampPalette(brewer.pal(9,“Blues"))(20)labels=Crime_filled$state,除此之外,我们也可以使用花(flower)来展示多维数据,如

ch_图8-7-8_花瓣类型图表.png
图8-7-8

所示。每朵花的花瓣大小可以代表一维数据,如

展示了六维数据,其中X和Y轴各代表一维变量(muder和Robbery),4个花瓣也各代表一维数据(ForcibleRate、AggravatedAssult、Burglary和LarcenyTheft)。

展示了七维数据。

8.8 表格图

一句话:表格图:大数据集(≥1000条)探索利器:变量关系、缺失数据一眼可见。

表格图(tableplot)是一种用于探索和分析大数据集的可视化方法,可以用于探索变量之间的关系、发现数据的内在模式、检查缺失数据的产生与选择。表格图主要用于可视化多变量的数据集和大量的数据记录,至少有1000个数据。

ch_图8-8-1_diamonds数据集的表格图.png
图8-8-1
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
library(tabplot)
#devtools::install_github("mtennekes/tabplot")
library(RColorBrewer)  
tabplot::tableplot(diamonds, sortCol =price, 
                 select = c(price,carat,cut, color, clarity,depth, table),
                 pals = list(cut=palette(brewer.pal(9,"Purples"))[c(2,3,4,5,7,8)],
                             color=palette(brewer.pal(9,"Oranges"))[c(2:9)], 
                             clarity=palette(brewer.pal(9,"Greens"))[1:8]),
                 fontsize = 9)

使用表格图展示了diamonds数据集。整个数据集根据变量price排序,每列代表一个变量,然后将每个数据分组到每个行的箱体中(rowbin)。00051.0150.005101520技能表格图R中tabplot包的tableplot()函数可以实现如

所示的效果。由于数据信息较多,为保证数据图表的美观,推荐使用单色渐变系列作为各个子图的颜色主题,如绿色"Greens”、紫色“Purples”橙色"Oranges"。select=c(price,carat,cut,color,clarity,depth,table))pals=list(cut=palette(brewer.pal(9,"Purples")[c(2.3,4,5.7.8)],color=palette(brewer.pal(9."Oranges"))[c(2:9)],clarity=palette(brewer.pal(9,"Greens")[1:8]))

本章一句话总结:高维数据选图:PCA/聚类看整体格局、t-SNE看聚类结构、热力图看全貌、平行坐标做多维比较——16S测序第一张图通常是PCA。
×