R语言圆环条形图可视化

北京湿疹主治医院 http://m.39.net/pf/a_8890894.html

R语言的数据可视化功能非常的丰富,下面将会介绍如何利用R语言中的相关包,可视化圆环条形图对数据进行可视化分析。圆环条形图,可以将其看作是条形图的一种变形,下面将会主要使用ggplot2包中的函数可视化学生的成绩数据。将会分别介绍堆积的圆环条形图和非堆积的圆环条形图。首先导入会使用到的包和数据:

library(tidyverse)library(stringr)library(ggplot2)##读取数据stuper-read.csv("data/chap14/StudentsPerformance.csv")head(stuper)##IDgendergroupmathscorereadingscorewritingscore##1Name1femalegroupB##2Name2femalegroupC##3Name3femalegroupB##4Name4malegroupA##5Name5malegroupC##6Name6femalegroupB

(1)圆环条形图

前面读取带数据stuper中,ID变量对应着每个学生的名称,group变量对应着学生的分组,三个数值变量则是三种成绩的得分。我们需要可视化的数据为不同分组下部分学生readingscore得分的取值情况(由于条形图不适合放置更多的柱子,所以只可视化数据的小部分样本),针对一个分组一个数值变量的数据,使用圆环条形图对其进行可视化,想要获得如图1所示的效果。

图1分组圆环条形图可视化数据的得分情况

图1中,所有的柱子围为一个圆环,并且每个分组下的柱子时有顺序的排列,在每个分组之间的空白区域添加了蓝色的环线,用于分析柱子高低的参考线,每个柱子都有根各自的名称标签,针对该图像的可视化下面会详细的介绍其可视化过程,会分为:可视化数据准备、与图像可视化过程两个步骤进行介绍。

首先介绍图像1的可视化数据准备工作,下面的程序则是获取要可视化的50个学生的样本数据,获取数据中的ID、group和readingscore三个变量的数据。

##数据准备,只使用前50个样本可视化,并排序stuper-stuper[1:50,c(1,3,5)]stupergroup-as.factor(str_extract(stupergroup,"[A-Z]"))##同时对分组和得分排序,可获得排序的圆环条形图stuper-stuper%%arrange(group,readingscore)table(stupergroup)##ABCDE##

上面的程序获取数据后,还将数据根据group变量和readingscore进行排序,这样可视化时就是排序的圆环条形图,并且输出了每个分组下的样本数量。获取待可视化的数据后,下面的程序则是生成可视化数据与辅助数据的过程,主要包含下面几个步骤:

(1)为stuper数据表的每个分组的结尾添加几行缺失值数据,这是为了可视化每个分组之间的空白分割;

(2)计算每个样本在y轴的位置和倾斜角度,这样主要是为了将每个柱子的标签和柱子对齐,使图像更美观,获得数据表label_data;

(3)为每个分组数据的黑色弧线准备数据base_data;

(4)为可视化参考线准备数据,获得数据表grid_data。

##在每个分组数据的后面插入几行缺失值empty_bar-3to_add-data.frame(matrix(NA,empty_bar*nlevels(stupergroup),ncol(stuper)))colnames(to_add)-colnames(stuper)#设置数据表的名称to_addgroup-rep(levels(stupergroup),each=empty_bar)#为数据表添加分组变量stuper-rbind(stuper,to_add)#合并两个数据stuper-stuper%%arrange(group)#将数据根据分组进行排序stuperid-seq(1,nrow(stuper))#获取每个样本的名称在y轴的位置和倾斜角度label_data-stupernumber_of_bar-nrow(label_data)#计算条的数量##每个条上标签的轴坐标的倾斜角度angle-90-*(label_dataid-0.5)/number_of_barlabel_datahjust-ifelse(angle-90,1,0)#调整标签的对其方式label_dataangle-ifelse(angle-90,angle+,angle)##标签倾斜角度##为数据准备基础弧线的数据base_data-stuper%%group_by(group)%%summarize(start=min(id),end=max(id)-empty_bar)%%rowwise()%%mutate(title=mean(c(start,end)))#为网格标尺准备数据grid_data-base_datagrid_dataend-grid_dataend[c(nrow(grid_data),1:nrow(grid_data)-1)]+1grid_datastart-grid_datastart-1grid_data-grid_data[-1,]

数据准备好后,可以使用下面的程序使用数据进行可视化,运行程序后即可获得可视化图像1。针对可使图像的程序也可以分为下面几个部分,分别为:

(1)使用stuper数据可视化条形图;

(2)使用grid_data数据为条形图添加参考线;

(3)为每个参考线添加文本注释;

(4)设置Y轴的取值范围,为了将圆心留出合适的空白区域;

(5)通过主题函数对图像显示效果进一步的调整,并转化为极坐标系;

(6)使用label_data为每个柱子设置标签;

(7)使用base_data数据表为圆环添加底部的弧线和分组数据的标签。

##可视化分组圆环条形图p1-ggplot(stuper)+##添加条形图geom_bar(aes(x=as.factor(id),y=readingscore,fill=group),stat="identity",alpha=0.8)+##为条形图添加一些划分等级的线(20/40/60/80)(按比例添加是因为知道满分)geom_segment(data=grid_data,aes(x=end,y=80,xend=start,yend=80),colour="blue",alpha=0.5,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=60,xend=start,yend=60),colour="blue",alpha=0.5,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=40,xend=start,yend=40),colour="blue",alpha=0.5,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=20,xend=start,yend=20),colour="blue",alpha=0.5,size=0.5,inherit.aes=FALSE)+#添加文本表示(20/40/60/80)表示每条线的大小annotate("text",x=rep(max(stuperid),4),y=c(20,40,60,80),label=c("20","40","60","80"),color="blue",size=3,angle=0,fontface="bold",hjust=1)+ylim(-,)+##设置y轴坐标表的取值范围,可流出更大的圆心空白##设置使用的主题并使用极坐标系可视化条形图theme_minimal()+theme(legend.position="none",#不要图例axis.text=element_blank(),#不要x轴的标签axis.title=element_blank(),#不要坐标系的名称panel.grid=element_blank(),#不要网格线plot.margin=unit(rep(-1,4),"cm"))+##整个图与周围的边距coord_polar()+##极坐标系##为条形图添加文本geom_text(data=label_data,aes(x=id,y=readingscore+5,label=ID,hjust=hjust),color="black",fontface="bold",alpha=0.8,size=2.5,angle=label_dataangle,inherit.aes=FALSE)+#为图像添加基础线的信息geom_segment(data=base_data,aes(x=start,y=-5,xend=end,yend=-5),colour="black",alpha=0.8,size=0.6,inherit.aes=FALSE)+##添加分组文本信息geom_text(data=base_data,aes(x=title,y=-18,label=group),alpha=0.8,colour="black",size=4,fontface="bold",inherit.aes=FALSE)p1

运行程序后最终获得的可视化图像如图1所示。

图1分组圆环条形图可视化数据的得分情况

(2)堆积圆环条形图

前面介绍的示例是只使用了一个数值变量进行数据可视化,针对每个柱子还可以使用不同的颜色表示不同变量的取值,例如:对一个分组多个数值的数据使用堆积的圆环条形图进行数据可视化,针对上述的学生成绩数据,可以同时可视化数据中的三种得分(mathscore、readingscore、writingscore),如图2所示可视化图像。

图2堆积圆环条形图

图2与图像1最大的差异是,每个柱子使用了不同的颜色来表示不同学习的成绩得分,从而表达了更丰富的数据信息,其数据准备与可视化过程和图1的过程几乎一致,只有很少的差距。其数据准备程序如下:

##读取数据stuper-read.csv("data/chap14/StudentsPerformance.csv")##数据准备,只使用前50个样本可视化,并排序stuper-stuper[1:50,c(1,3:6)]stupergroup-as.factor(str_extract(stupergroup,"[A-Z]"))##将宽数据转化为长数据stuper-pivot_longer(stuper,cols=c(3:5),names_to="scoregroup")##同时对分组和得分排序,可获得排序的圆环条形图stuper-stuper%%arrange(group)##在每个分组数据的后面插入几行缺失值empty_bar-2nscoretype-nlevels(as.factor(stuperscoregroup))#计算得分种类的数量to_add-data.frame(matrix(NA,empty_bar*nlevels(stupergroup)*nscoretype,ncol(stuper)))colnames(to_add)-colnames(stuper)#设置数据表的名称#为数据表添加分组变量to_addgroup-rep(levels(stupergroup),each=empty_bar*nscoretype)stuper-rbind(stuper,to_add)#合并两个数据stuper-stuper%%arrange(group,ID)#将数据根据分组和名称进行排序stuperid-rep(seq(1,nrow(stuper)/nscoretype),each=nscoretype)#获取每个样本的名称在y轴的位置和倾斜角度label_data-stuper%%group_by(id,ID)%%summarize(tot=sum(value))number_of_bar-nrow(label_data)angle-90-*(label_dataid-0.5)/number_of_barlabel_datahjust-ifelse(angle-90,1,0)label_dataangle-ifelse(angle-90,angle+,angle)#为数据准备基础弧线的数据base_data-stuper%%group_by(group)%%summarize(start=min(id),end=max(id)-empty_bar)%%rowwise()%%mutate(title=mean(c(start,end)))#为网格标尺准备数据grid_data-base_datagrid_dataend-grid_dataend[c(nrow(grid_data),1:nrow(grid_data)-1)]+1grid_datastart-grid_datastart-1grid_data-grid_data[-1,]

上面的数据准备程序和可视化图1的过程几乎一致,只是多了一个宽数据转化为长数据的过程,这里就不再一一的详细介绍了,数据准备后可使用下面的程序进行数据可视化,运行程序后即可获得如图2所示的图像。由于可视化程序很相似,这里就不再进行详细的介绍了。

##可视化多组数据的圆环条形图library(viridis)p2-ggplot(stuper)+geom_bar(aes(x=as.factor(id),y=value,fill=scoregroup),stat="identity",alpha=0.5)+scale_fill_viridis(discrete=TRUE)+#为条形图添加一些划分等级的线(50///,)geom_segment(data=grid_data,aes(x=end,y=0,xend=start,yend=0),colour="blue",alpha=1,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=50,xend=start,yend=50),colour="blue",alpha=1,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=,xend=start,yend=),colour="blue",alpha=1,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=,xend=start,yend=),colour="blue",alpha=1,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=,xend=start,yend=),colour="blue",alpha=1,size=0.5,inherit.aes=FALSE)+geom_segment(data=grid_data,aes(x=end,y=,xend=start,yend=),colour="blue",alpha=1,size=0.5,inherit.aes=FALSE)+#添加文本表示(50///)表示每条线的大小annotate("text",x=rep(max(stuperid),6),y=c(0,50,,,,),label=c("0","50","","","",""),color="blue",size=3,angle=0,fontface="bold",hjust=1)+ylim(-,)+theme_minimal()+theme(legend.position="none",axis.text=element_blank(),axis.title=element_blank(),panel.grid=element_blank(),plot.margin=unit(rep(-1,4),"cm"))+coord_polar()+#为每个条形图的顶端添加名称geom_text(data=label_data,aes(x=id,y=tot+10,label=ID,hjust=hjust),color="black",fontface="bold",alpha=0.6,size=2.5,angle=label_dataangle,inherit.aes=FALSE)+#添加分组数据的基础线geom_segment(data=base_data,aes(x=start,y=-5,xend=end,yend=-5),colour="black",alpha=0.8,size=0.6,inherit.aes=FALSE)+geom_text(data=base_data,aes(x=title,y=-30,label=group),colour="black",alpha=0.8,size=4,fontface="bold",inherit.aes=FALSE)p2



转载请注明:http://www.sonphie.com/jibzd/14488.html

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 网站简介| 发布优势| 服务条款| 隐私保护| 广告合作| 网站地图| 版权申明

    当前时间: