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

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

7.1 饼状图系列

一句话:占比展示:饼图系列,注意人眼对角度不敏感,作者建议慎用。

7.1.1 饼图

一句话:饼图:各分类占比,扇区大小=比例,最经典的占比图。

饼图(piechart)被广泛地应用于各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个切片,整个圆饼代表数据的总量,每个切片(圆弧)表示该分类占总体的比例,所有切片(圆弧)的加和等于100%。饼图可以很好地帮助用户快速了解数据的占比分配。

它的主要缺点是:(1)饼图不适用于多分类的数据,原则上一张饼图不可多于9个分类。因为随着分类的增多,每个切片就会变小,最后导致大小区分不明显,每个切片看上去都差不多大小,这样对于数据的对比是没有什么意义的。(2)相对具备同样功能的其他图表(比如百分比堆积柱形图、圆环图),饼图需要占据更大的画布空间,所以饼图不适合用于数据量大的场景。

(3)很难在多个饼图之间进行数值比较,此时可以使用百分比堆积柱形图或者百分比堆积条形图替代。(4)饼图不适合多变量的连续数据的占比可视化,此时应该使用百分比堆积面积图展示数据,比如多变量的时序数据。排序问题在绘制饼图前一定注意要把多个类别按一定的规则排序,但不是简单地升序或者降序。

人在阅读材料时一般都是从上往下,按顺时针方向的,所以千万不要将饼图的类别数据按从小到大、顺时针方向展示。因为如果按顺时针或者逆时针的顺序由小到大排列饼图的数据类别,那么最不重要的部分就会占据图表最显著的位置。阅读饼图就如同阅读钟表一样,人会潜意识地从而12点开始顺时针往下阅读内容。

因此,如果最大占比类别超过50%,推荐将饼图的最大部分放置在12点指针的右边,以强调其重要性。再将第二大占比的类别设置在12点指针的左边,剩余的类别则按逆时针方向放置。这样的话,最小占比的类别就会放置在最不重要的位置,即靠近图表底部,如

ch_图7-1-1_饼图(a).pngch_图7-1-1_饼图(b).pngch_图7-1-1_饼图(c).pngch_图7-1-1_饼图(d).png
图7-1-1
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts


library(RColorBrewer)  
library(dplyr)
library(graphics)

#-------------------------图7-1-1 饼图(a)------------------------------------------
df <- data.frame(value = c(24.20,30.90,12.50,12.30,8.10,12.10), 
                 group = c('LVS','SJM','MCE','Galaxy','MGM','Wynn'))
df <-arrange(df,value)

labs <- paste0(df$group," \n(", round(df$value/sum(df$value)*100,2), "%)")

pie(df$value,labels=labs, init.angle=90,col =  brewer.pal(nrow(df), "Reds"),
    border="black")



#-------------------------图7-1-1 饼图(b)------------------------------------------
df <- data.frame(value = c(24.20,75.90,12.50,12.30,8.10,12.10), 
                 group = c('LVS','SJM','MCE','Galaxy','MGM','Wynn'))
df <-arrange(df,desc(value))
df$color<-rev(brewer.pal(nrow(df), "Blues"))#Oranges

df<-df[c(2:nrow(df),1),]
labs <- paste0(df$group," \n(", round(df$value/sum(df$value)*100,2), "%)")

pie(df$value,labels=labs, init.angle=90,col = df$color,
    border="black")

n<-6
gg_color_hue <- function(n) {hues = seq(15, 375, length = n + 1); hcl(h = hues, l = 65, c = 100)[1:n]} 
pie(df$value,labels=labs, init.angle=90,col =gg_color_hue(n),
    border="black")

pie(df$value,labels=labs, init.angle=90,col ="#3182BD",
    border="black")

#-------------------------图7-1-1 饼图(c)------------------------------------------
df <- data.frame(value = c(24.20,75.90,12.50,12.30,8.10,12.10), 
                 group = c('LVS','SJM','MCE','Galaxy','MGM','Wynn'))
df <-arrange(df,value)

labs <- paste0(df$group," \n(", round(df$value/sum(df$value)*100,2), "%)")

pie(df$value,labels=labs, init.angle=90,col =  brewer.pal(nrow(df), "Reds"),
    border="black")


#-------------------------图7-1-1 饼图(d)------------------------------------------
df <- data.frame(value = c(24.20,30.90,12.50,12.30,8.10,12.10), 
                 group = c('LVS','SJM','MCE','Galaxy','MGM','Wynn'))
df <-arrange(df,desc(value))
df$color<-rev(brewer.pal(nrow(df), "Oranges"))

df<-df[c(2:nrow(df),1),]

labs <- paste0(df$group," \n(", round(df$value/sum(df$value)*100,2), "%)")

pie(df$value,labels=labs, init.angle=90,col = df$color,
    border="black")

所示。如果最大占比类别不是很大,一般小于50%时,则可以将数据从12点指针的右边开始,按从小到大、顺时针方向放置类别,如

所示。另外,我们可以以

作为对比,看两者的数据表达效果。第7章重局部整体型图表1215技能饼图使用R中ggplot2包的geom_bar()函数绘制堆积柱形图,然后将直角坐标系转换成极坐标系,就可以显示为饼图,但还是需要使用geom_text()函数添加数据标签。由于缺乏饼图与数据标签之间的引导线,总感觉美观度不够,所以推荐使用graphics包的pie()函数绘制饼图,其中

的具体实现代码如下所示。#

(a)df<-data.frame(value=c(24.20.75.90,12.50,12.30,8.10,12.10).group=c('LVS',SJM',MCE',Galaxy',MGM',Wynn'))df<-arrange(df.desc(value))df$color<-rev(brewer.pal(nrow(df),"Oranges")labs<-paste()(df$group,"\n(",round(df$value/sum(df$svalue)*100,2)."%)")#

(b)df<-data.frame(value=c(24.20,30.90,12.50,12.30,8.10,12.10)group=c(LVS"SJM",MCE,Galaxy”MGM",Wynn))labs<-paste()(df$group."\n(".round(df$value/sum(df$value)*100.2),"%)")

7.1.2 圆环图

一句话:圆环图:饼图挖空中心,多个饼并列时更好比较。

圆环图(又叫作甜甜圈图,donuthart),其本质是将饼图的中间区域挖空。虽然如此,圆环图还是有其优点。饼图的整体性太强,会让我们将注意力集中在比较饼图内各个扇形之间占整体比重的关系。

但如果我们将两个饼图放在一起,则很难同时对比两个图。圆环图在解决上述问题时,采用了让我们更关注长度而不是面积的做法。这样我们就能相对简单地对比不同的圆环图。

同时圆环图相对于饼图空间的利用率更高,比如我们可以使用它的空心区域显示文本信息,比如标题。

7.1.3 复合饼图系列

一句话:复合饼图:散点位置+饼图占比,一张图同时看3个变量。

散点复合饼图(compoundscatterandpiechart)可以展示三个数据变量的信息:(x,y,P),其中x和y决定气泡在直角坐标系中的位置,P表示饼图的数据信息,决定饼图中各个类别的占比情况,如

ch_图7-1-3_散点复合饼图系列(a).pngch_图7-1-3_散点复合饼图系列(b).png
图7-1-3
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
library(scatterpie)
library(RColorBrewer)

crime <- read.csv("crimeRatesByState2005.tsv",header = TRUE, sep = "\t", stringsAsFactors = F)
radius <- sqrt(crime$population / pi)
Max_radius<-max(radius)
Bubble_Scale<-0.1
crime$radius <- Bubble_Scale * radius/Max_radius

mydata<-crime[,c(2,4,3,5:8)]  #数据集构造
Col_Mean<-apply(mydata,2,mean)
Col_Sort<-sort(Col_Mean,index.return=TRUE,decreasing = TRUE)
mydata<-mydata[,Col_Sort$ix]
x<-(mydata$murder-min(mydata$murder))/(max(mydata$murder)-min(mydata$murder))+0.00001
y<-(mydata$Robbery-min(mydata$Robbery))/(max(mydata$Robbery)-min(mydata$Robbery))+0.00001

xlabel<-seq(0,10,2)
xbreak<-(xlabel-min(mydata$murder))/(max(mydata$murder)-min(mydata$murder))+0.00001
ylabel<-seq(0,260,50)
ybreak<-(ylabel-min(mydata$Robbery))/(max(mydata$Robbery)-min(mydata$Robbery))+0.00001

mydata2<-data.frame(x,y,radius=crime$radius)
mydata2<-cbind(mydata2,mydata)

Legnd_label<-colnames(mydata2)[4:10]
colnames(mydata2)[4:10]<-LETTERS[1:7]

#---------------------------------------图7-1-3 散点复合饼图系列(a)-------------------------------------------------
ggplot() + 
  geom_scatterpie(aes(x=x, y=y,r=0.05), data=mydata2, cols=colnames(mydata2)[4:10],alpha=0.9,size=0.1) +
  scale_fill_manual(values=colorRampPalette(brewer.pal(7, "Set2"))(7),labels=Legnd_label)+
  #geom_scatterpie_legend(mydata2$radius, x=0.1, y=0.95, n=5,labeller=function(x) round((x* Max_radius/ Bubble_Scale)^2*pi))+
  #geom_scatterpie_legend(mydata2$radius, x=0.009758116, y=0.090868067, n=4,labeller=function(x) round((x* Max_radius/ Bubble_Scale)^2*pi))+
  scale_x_continuous(breaks=xbreak, labels=xlabel)+
  scale_y_continuous(breaks=ybreak, labels=ylabel)+
  xlab("murder")+
  ylab("Robbery")+
  coord_fixed()+
  theme(
    axis.title=element_text(size=15,face="plain",color="black"),
    axis.text = element_text(size=13,face="plain",color="black"),
    legend.title=element_text(size=15,face="plain",color="black"),
    legend.text = element_text(size=14,face="plain",color="black")
  )

#---------------------------------------图7-1-3 散点复合饼图系列(b)-------------------------------------------------
ggplot() + 
  geom_scatterpie(aes(x=x, y=y,r=radius), data=mydata2, cols=colnames(mydata2)[4:10],alpha=0.9,size=0.25) +
  scale_fill_manual(values=colorRampPalette(brewer.pal(7, "Set2"))(7),labels=Legnd_label)+
  geom_scatterpie_legend(mydata2$radius, x=0.1, y=0.95, n=5,
                         labeller=function(x) round((x* Max_radius/ Bubble_Scale)^2*pi))+
  #geom_scatterpie_legend(mydata2$radius, x=0.009758116, y=0.090868067, n=4,labeller=function(x) round((x* Max_radius/ Bubble_Scale)^2*pi))+
  scale_x_continuous(breaks=xbreak, labels=xlabel)+
  scale_y_continuous(breaks=ybreak, labels=ylabel)+
  xlab("murder")+
  ylab("Robbery")+
  coord_fixed()+
  theme(
    axis.title=element_text(size=15,face="plain",color="black"),
    axis.text = element_text(size=13,face="plain",color="black"),
    legend.title=element_text(size=15,face="plain",color="black"),
    legend.text = element_text(size=14,face="plain",color="black")
  )

#label<-seq(350000,35000000,10000000)
#x<-sqrt(label/pi)/Max_radius*Bubble_Scale

所示。气泡复合饼图(compoundbubbleandpiechart)可以展示四个数据变量的信息:(x,y,z,P),其中x和y决定气泡在直角坐标系中的位置,z决定气泡的大小,P表示饼图的数据信息,决定饼图中各个类别的占比情况,如

所示。技能气泡复合饼图R中scatterpie包的geom_scatterpie()函数可以绘制散点复合饼图。但是该函数只能结合ggplot2包的coordfixed()函数,保证X轴与Y轴坐标使用了同一最小单位(unit)。

另外,推荐根据数据集每个数据系列的均值做排序处理后,再绘制饼图展示数据,使读者能更好地发现数据规律与获取数据信息。绘制

所示的气泡复合饼图的具体代码如下所示

7.2 旭日图

一句话:旭日图:多层圆环显示层级,每圈一层,层级+占比一起看。

旭日图(sunburstdiagram),也被称为多层饼图(multi-levelpiechart)或径向树图,如

所示。这种图表通过一系列的圆环显示层次结构,再按不同类别节点进行切割。每个圆环代表层次结构中的一个级别,中心圆点表示根节点,层次结构从这个点往外推移。

之后圆环会按照其与原属切片的层次关系再被分割,分割角度可以是均等平分,或者与某个数值成比例。单层的旭日图其实类似于圆环图,但是多层的旭日图展示了外层环状数据与内层环状数据的关系信息。冰柱图(iciclediagram)也叫分区层图(partitionlayerchart),就是直角坐标系下的旭日图,因为它看起来像是冬天屋檐下形成的一排排的冰柱,所以以此命名,如

所示。

ch_图7-2-3_旭日图(a).pngch_图7-2-3_旭日图(b).png
图7-2-3

所示的是具有层次关系的树状数据,在极坐标系下使用多个圆环的形式展示数据,效果的如

所示的旭日图。而在直角坐标系下展示数据,则效果为如

所示的冰柱图。推荐使用不同颜色突出显示层次分组或特定类别,这样方便观察数据内在的层次关系与占比情况。技能旭日图在R中可以使用ggraph包的ggraph()函数,选择不同的参数,就可以分别绘制旭日图和冰柱图,同时使用geom_node_text()函数添加不同层次的数据标签。

所示的旭日图和

所示冰柱图的具体实现代码如下所示

旭日图geom_node_arc_bar(aes(fill = as.factor(depth)). size = 0.25)+geom_node_text(aes(label=shortName,filter=(depth==0)),size=6,angle=0,colour=white")+geom_node_text(aes(label=shortName,filter=(depth==1),size=3.5,angle=0,colour="white")+geom_node_text(aes(label=shortName,filter=(depth<=3&depth>1&size<10))size=2,angle=0)+scale_fill_manual(values=colormap)+#

冰柱图geom_node_tile(aes(fill =as.factor(depth).size =0.25)+geom_node_text(aes(label=shortName,filter=(depth==0)).size=6,angle=0.colour="white")+geom_node_text(aes(label=shortName,filter =(depth==1 )),size=3.5,angle=90.colour="white")+geom_node_text(aes(label=shortName.filter=(depth<=3&depth>1&size<10)).size=1.5,angle=90)+scale_fill_manual(values=colormap)+

7.3 矩形树状图

一句话:矩形树状图:嵌套矩形显示层级+面积占比,空间利用率高。

矩形树状图,亦被称为树状结构图(treemap,rectangulartree),它是一种利用嵌套式矩形显示层次结构的方法,同时通过面积大小显示每个类别的数量,如

所示。矩形树状图采用矩形表示层次结构里的节点,父子节点之间的层次关系用矩形之间的相互嵌套隐喻来表达。每个类别会被分配一个矩形区域,而其子类别则由嵌套在其中的小矩形代表。

当不同类别被分配不同数量时,这些矩形的面积大小会与数量成正比显示:小矩形与小矩形之间(部分对部分)及小矩形与大矩形之间(部分对整体)的面积比例。此外,主类别的面积大小是其所有子类别的总和。如果没有数量分配给子类别,那么其面积则是主类别的总面积除以子类别的数目。

因此矩形树状图是一种紧凑而且节省空间的层次结构显示方式,能够直观体现同级类别之间的比较。我们也可以通过比较大小来比较类别之间的比例。矩形树状图把具有层次关系的数据可视化为一组嵌套的矩形,所有矩形的面积之和代表了整体的大小,各个小矩形的面积表示每个子数据的占比大小。

所以矩形面积越大,表示子数据在整体中的占比越大(见

ch_图7-3-2_树状图(a).pngch_图7-3-2_树状图(b).png
图7-3-2

)。矩形树状图的好处在于,相比传统的树形结构图,矩形树状图能更有效地利用空间,并且拥有展示占比的功能。矩形树状图的缺点在于,当分类占比太小的时候,文本会变得很难排布。

相比分叉树形图,矩形树状图的树形数据结构表达得不够直观、明确。222!R语言数据可视化之美:专业图表绘制指南技能矩形树状图R中ggplo2包的拓展包treemapify可以提供treemapify()函数将数据转换成矩形树状图,从而可以使用geomrect()函数绘制矩形块,用geom_text()函数添加数据标签,如

所示。但是这种方法需要的数据计算与转换相对比较复杂。所以推荐读者直接使用treemap包的treemap()函数绘制矩形树状图,如

所示,具体代码如下所示

所示。ShneidermanB,Plaisant C.Treemaps for space-constrainedvisualization of hierarchies[J].1998.与其他变体树状图不同,如方形树状图(squarifiedtreemap)或缓冲树状图(cushiontreemap),矩形树状图还进化成更加美观的圆堆积图(圆形树状图),如

所示。一开始BenShneiderman对这种演变的圆堆积图是不认同的。虽然圆堆积图看起来漂亮,但不及矩形树状图节省空间(因为圆圈内会有很多空白),可是它实际上比矩形树状图更能有效显示层次结构。

1图片来源:http://lip.sourceforge.net/ctreemap.html224|·R语言数据可视化之美:专业图表绘制指南

7.4 马赛克图

一句话:马赛克图:双向100%堆叠条形,检验两个类别变量的关系。

马赛克图(mosaicplot,又名marimekkochart),显示分类数据中一对变量之间的关系,原理类似双向的100%堆叠式条形图,但其中所有条形在数值/标尺轴上具有相等长度,并会被划分成段。可以通过这两个变量来检测类别与其子类别之间的关系。马赛克图的主要缺点在于难以阅读,特别是当含有大量分段的时候。

此外,我们也很难准确地对每个分段进行比较,因为它们并非沿着共同基线排列在一起。因此,不等宽柱状图比较适合提供数据概览。非坐标轴非均匀的马赛克图也是统计学领域标准的马赛克图,一个非均匀的马赛克图包含以下构成元素:①非均匀的分类坐标轴;②面积、颜色均有含义的矩形块:③图例。

对于非均匀的马赛克图,关注的数据维度非常多,一般的用户很难直观理解,在多数情况下可以被拆解成多个不同的图表。

ch_图7-4-1马赛克图系列.png
图7-4-1

为原始数据,包括segment(A,B,C,D)和variable(Alpha,Beta,Gamma,Detal)两组变量的对应数值。先按行分别求每个variable(变量)的占比,结果如

所示。根据该数据可以使用geom_bar()函数,绘制堆积百分比柱形图,如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts

library(ggplot2)
library(RColorBrewer)
library(reshape2)  #提供melt()函数
library(plyr)      #提供ddply()函数,join()函数

df <- data.frame(segment = c("A", "B", "C","D"),
                      Alpha = c(2400	,1200,	600	,250), 
                      Beta = c(1000	,900,	600,	250),
                      Gamma = c(400,	600	,400,	250), 
                      Delta = c(200,	300	,400,	250))

melt_df<-melt(df,id="segment")

segpct<-rowSums(df[,2:ncol(df)])


for (i in 1:nrow(df)){
  for (j in 2:ncol(df)){
    df[i,j]<-df[i,j]/segpct[i]*100  #将数字转换成百分比
  }
}

segpct<-segpct/sum(segpct)*100
df$xmax <- cumsum(segpct)
df$xmin <- (df$xmax - segpct)

dfm <- melt(df, id = c("segment", "xmin", "xmax"),value.name="percentage")
colnames(dfm)[ncol(dfm)]<-"percentage"

#ddply()函数使用自定义统计函数,对data.frame分组计算
dfm1 <- ddply(dfm, .(segment), transform, ymax = cumsum(percentage))
dfm1 <- ddply(dfm1, .(segment), transform,ymin = ymax - percentage)
dfm1$xtext <- with(dfm1, xmin + (xmax - xmin)/2)
dfm1$ytext <- with(dfm1, ymin + (ymax - ymin)/2)

#join()函数,连接两个表格data.frame
dfm2<-join(melt_df, dfm1, by = c("segment", "variable"), type = "left", match = "all")

ggplot()+
  geom_rect(aes(ymin = ymin, ymax = ymax, xmin = xmin, xmax = xmax, fill = variable),dfm2,colour = "black") + 
  geom_text(aes(x = xtext, y = ytext,  label = value),dfm2 ,size = 4)+
  geom_text(aes(x = xtext, y = 103, label = paste("Seg ", segment)),dfm2 ,size = 4)+
  geom_text(aes(x = 102, y = seq(12.5,100,25), label = c("Alpha","Beta","Gamma","Delta")), size = 4,hjust = 0)+
  scale_x_continuous(breaks=seq(0,100,25),limits=c(0,110))+
  theme(panel.background=element_rect(fill="white",colour=NA),
        panel.grid.major = element_line(colour = "grey60",size=.25,linetype ="dotted" ),
        panel.grid.minor = element_line(colour = "grey60",size=.25,linetype ="dotted" ),
        text=element_text(size=15),
        legend.position="none")



#-----------------------------------------------Method 2-----------------------------------
library(vcd)
table<-xtabs(value ~variable+segment, melt_df)
mosaic( ~segment+variable,table,shade=TRUE,legend=TRUE,color=TRUE)

所示。再对每行求和并求其百分比占比为(40,30,20,10),其累积的百分比的xmax(最大值)与xmin(最小值),如

所示。使用geomrect()函数可以绘制非均匀的马赛克图,如

所示。(b)计算转换得到的百分比占比数据1.00白技能马赛克图在R中,可以使用ggplot2包的geom_rect()函数、ggmosaic包的geom_mosai()函数、graphics包的mosaicplot()函数,或者vcd包的mosaic()函数绘制马赛克图。但是笔者推荐使用geom_rect()函数绘制,虽然代码比其他三种方法稍微复杂,但是可以绘制得更加美观,其实现代码如下所示。

#提供ddply()函数join()函数df<-data.frame(segment=c("A",“B”,"C","D").Alpha =c(2400,1200,600,250)Gamma=c(400,600,400,250).Delta=c(200,300,400,250))melt_df<-melt(df,id="segment")segpct<-rowSums(df[.2:ncol(df)])df[i.j]<-dffij]/segpct[]*100#将数字转换成百分比segpct<-segpct/sum(segpct)*100df$xmin<-(df$xmax-segpct)dfm<-melt(df,id=c(“segment","xmin"“xmax").value.name="percentage”)#ddply()函数使用自定义统计函数,对data.frame分组计算dfm1<-ddply(dfm..(segment),transform,ymax=cumsum(percentage)dfm1$xtext<-with(dfm1,xmin+(xmax-xmin)/2)dfm1$ytext<-with(dfm1,ymin+(ymax-ymin)/2)#join()函数,连接两个表格data.framedfm2<-join(melt_df,dfm1,by=c(“segment",“variable"),type=“left”,match="all)geom_rect(aes(ymin=ymin,ymax=ymax,xmin=xmin,xmax=xmax,fill=variable),dfm2,colour=“black")+geom_text(aes(x=xtext,y=ytext,label=value),dfm2,size=4)+scale_x_continuous(breaks=seq(0,100.25).limits=c(0.110))+panel.grid.major =element_line(colour =“grey60"size=.25.linetype ="dotted").panel.grid.minor=element _line(colour="grey60",size=.25.linetype ="dotted"),text=element_text(size=15).类别数据具有层次结构,能使读者从不同的层次与角度去观察数据。类别数据的可视化主要包括矩形树状图和马赛克图两种类型。矩形树状图能结合矩形块的颜色展示一个紧致的类别空间:马赛克图能按行或按列展示多个类别的比较关系。

矩形树状图用于展示树形数据,是关系型数据。马赛克图用于分析列表数据,是非关系型数据,如

所示。矩形树状图马赛克图马赛克图的故事在1844年,Minard绘制了一幅名为“TableauGraphique”的图形,显示了运输货物和工作人员的不同成本。在这幅图中,他创新地使用了分块的条形图,其宽度对应路程,高度对应旅客或货物种类的比例。

这幅图是当代马赛克图的先驱,如

所示。

7.5 华夫饼图

一句话:华夫饼图:一格=1%的方格图,精确到1%的占比展示。

华夫饼图分为块状华夫饼图和点状华夫饼图。块状华夫饼图(wafflechart)是展示总数据的组类别情况的一种有效图表。华夫饼是西方的一种由小方格组成的面包,所以这种图表因此得名为华夫饼图。

块状华夫饼图的小方格用不同颜色表示不同类别,适合用来快速检视数据集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让人更容易找出当中模式。块状华夫饼图主要包括侧重展示类别数值的堆积型块状华夫饼图和侧重展示离类别占比的百分百堆积型块状华夫饼图,如

ch_图7-5-1_块状华夫饼图_(a)堆积型.png
图7-5-1
#EasyChartsŶӳƷ
#ʹѧϰϵ΢ţEasyCharts

#------------------------------------------------ͼ7-5-1 ״ͼ(a)-------------------------------------------------------
library(ggplot2)
library(RColorBrewer)  

library(reshape2)
nrows <- 10
categ_table <- round(table(mpg$class ) * ((nrows*nrows)/(length(mpg$class))))
sort_table<-sort(categ_table,index.return=TRUE,decreasing = FALSE)
Order<-sort(as.data.frame(categ_table)$Freq,index.return=TRUE,decreasing = FALSE)

df <- expand.grid(y = 1:nrows, x = 1:nrows)
df$category<-factor(rep(names(sort_table),sort_table), levels=names(sort_table))


Color<-brewer.pal(length(sort_table), "Set2")

ggplot(df, aes(x = y, y = x, fill = category)) + 
  geom_tile(color = "white", size = 0.25) +
  #geom_point(color = "black",shape=21,size=6) + 
  coord_fixed(ratio = 1)+
  scale_x_continuous(trans = 'reverse') +#expand = c(0, 0),
  scale_y_continuous(trans = 'reverse') +#expand = c(0, 0),
  scale_fill_manual(name = "Category", 
                    #labels = names(sort_table),
                    values = Color)+
  theme(#panel.border = element_rect(fill=NA,size = 2),
    panel.background  = element_blank(),
    plot.title = element_text(size = rel(1.2)),
    #axis.text = element_blank(),
    #axis.title = element_blank(),
    #axis.ticks = element_blank(),
    # legend.title = element_blank(),
    legend.position = "right")

#------------------------------------------------------------------------------------------
library(ggforce)
ggplot(df, aes(x0 = y, y0 = x, fill = category,r=0.5)) + 
  geom_circle(color = "black", size = 0.25) +
  #geom_point(color = "black",shape=21,size=6) + 
  coord_fixed(ratio = 1)+
  scale_x_continuous(trans = 'reverse') +#expand = c(0, 0),
  scale_y_continuous(trans = 'reverse') +#expand = c(0, 0),
  scale_fill_manual(name = "Category", 
                    #labels = names(sort_table),
                    values = Color)+
  theme(#panel.border = element_rect(fill=NA,size = 2),
    panel.background  = element_blank(),
    plot.title = element_text(size = rel(1.2)),
    #axis.text = element_blank(),
    #axis.title = element_blank(),
    #axis.ticks = element_blank(),
    # legend.title = element_blank(),
    legend.position = "right")
#------------------------------------------------ͼ7-5-1 ״ͼ(b)------------------------------------------
library(dplyr)
nrows <- 10
ndeep <- 10
unit<-100
df <- expand.grid(y = 1:nrows, x = 1:nrows)

categ_table <- as.data.frame(table(mpg$class) * (nrows*nrows))
colnames(categ_table)<-c("names","vals")
categ_table<-arrange(categ_table,desc(vals))
categ_table$vals<-categ_table$vals /unit


tb4waffles <- expand.grid(y = 1:ndeep,x = seq_len(ceiling(sum(categ_table$vals) / ndeep)))
regionvec <- as.character(rep(categ_table$names, categ_table$vals))
tb4waffles<-tb4waffles[1:length(regionvec),]


tb4waffles$names <- factor(regionvec,levels=categ_table$names)

Color<-brewer.pal(nrow(categ_table), "Set2")


ggplot(tb4waffles, aes(x = x, y = y, fill = names)) + 
  #geom_tile(color = "white") + # 
  geom_point(color = "black",shape=21,size=5) + # 
  scale_fill_manual(name = "Category", 
                    values = Color)+
  xlab("1 square = 100")+
  ylab("")+
  coord_fixed(ratio = 1)+
  theme(#panel.border = element_rect(fill=NA,size = 2),
         panel.background  = element_blank(),
        plot.title = element_text(size = rel(1.2)),
        #axis.text = element_blank(),
        #axis.title = element_blank(),
        #axis.ticks = element_blank(),
        # legend.title = element_blank(),
        legend.position = "right")

#------------------------------------------------------------------------------------------
library(ggforce)

ggplot(tb4waffles, aes(x0 = x, y0 = y, fill = names,r=0.5)) + 
  #geom_tile(color = "white") + # 
  geom_circle(color = "black",size=0.25) + # 
  scale_fill_manual(name = "Category", 
                    values = Color)+
  xlab("1 square = 100")+
  ylab("")+
  coord_fixed(ratio = 1)+
  theme(#panel.border = element_rect(fill=NA,size = 2),
    panel.background  = element_blank(),
    plot.title = element_text(size = rel(1.2)),
    #axis.text = element_blank(),
    #axis.title = element_blank(),
    #axis.ticks = element_blank(),
    # legend.title = element_blank(),
    legend.position = "right")

所示。点状华夫饼图(dotmatrixchart)以点为单位显示离散数据,每种颜色的点表示一个特定类别,并以矩阵形式组合在一起,适合用来快速检视数据集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让人更容易找出当中模式。当只有一个变量/类别时(所有点都是相同颜色),点状华夫饼图相当于比例面积图,如

ch_图7-5-2_点状华夫饼图_(a)堆积型.png
图7-5-2

所示。2.5

本章一句话总结:局部整体选图:简单占比用饼图(人眼对角度不敏感,作者建议少用)、有层级用旭日图、层级+占比用树状图、精确到1%用华夫饼图。
×