3.1 柱形图系列
一句话:类别型/序数型变量对数值型变量:比较各项大小。
柱形图用于显示一段时间内的数据变化或显示各项之间的比较情况。在柱形图中,类别型或序数型变量映射到横轴的位置,数值型变量映射到矩形的高度。柱形图控制柱形的两个重要参数是:“设置系列数据格式”中的“系列重叠”和“分类间距”。
“分类间距”控制同一数据系列的柱形宽度,数值范围为[0.0,1.0];“系列重叠”控制不同数据系列之间的距离,数值范围为[-1.0,1.0]。
柱形图系列.png)
_柱形图系列.png)
柱形图系列.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
#---------------------------单数剧系列柱形图----------------------------------------------------
mydata<-data.frame(Cut=c("Fair","Good","Very Good","Premium","Ideal"),
Price=c(4300,3800,3950,4700,3500))
#mydata$Cut <- factor(mydata$Cut, levels = mydata$Cut[order(mydata$Order)])
ggplot(data=mydata,aes(x=Cut,y=Price))+
geom_bar(stat = "identity",
width = 0.8,colour="black",size=0.25,
fill="#FC4E07",alpha=1)+
ylim(0, 6000)+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black")
)
#---------------------------双数剧系列柱形图----------------------------------------------------
library(reshape2)
mydata<-read.csv("MultiColumn_Data.csv",check.names=FALSE,
sep=",",na.strings="NA",
stringsAsFactors=FALSE)
mydata<-melt(mydata,id.vars='Catergory')
ggplot(data=mydata,aes(Catergory,value,fill=variable))+
geom_bar(stat="identity",position=position_dodge(),
color="black",width=0.7,size=0.25)+
scale_fill_manual(values=c("#00AFBB", "#FC4E07"))+
ylim(0, 10)+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.background =element_blank(),
legend.position = c(0.88,0.88)
)
#-------------------------------堆积柱形图-------------------------------------------------------
mydata<-read.csv("StackedColumn_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata<-melt(mydata,id.vars='Clarity')
ggplot(data=mydata,aes(variable,value,fill=Clarity))+
geom_bar(stat="identity",position="stack", color="black", width=0.7,size=0.25)+
scale_fill_manual(values=brewer.pal(9,"YlOrRd")[c(6:2)])+
ylim(0, 15000)+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.background =element_blank(),
legend.position = c(0.85,0.82)
)
#------------------------------百分比堆积柱形图-------------------------------------------------------
mydata<-read.csv("StackedColumn_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata<-melt(mydata,id.vars='Clarity')
ggplot(data=mydata,aes(variable,value,fill=Clarity))+
geom_bar(stat="identity", position="fill",color="black", width=0.8,size=0.25)+
scale_fill_manual(values=brewer.pal(9,"GnBu")[c(7:2)])+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.position = "right"
)
为使用R中ggplot2包的geom_bar()函数直接绘制的一系列柱形图,包括(a)单数据系列柱形图、(b)多数据系列柱形图、(c)堆积柱形图、(d)百分比堆积柱形图4种常见类型。用R语言绘制柱形图和条形图的最大潜在问题就是排序问题。我们在用R的ggplot2包绘制柱形图时,X轴变量默认会按照输入的数据顺序绘制,Y轴变量和图例变量默认按照字母顺序绘制。
所以用R语言绘制柱形图系列图表时要注意:绘制图表前要对数据进行排序处理(见
_柱形图系列.png)
_柱形图系列.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
#---------------------------单数剧系列柱形图----------------------------------------------------
mydata<-data.frame(Cut=c("Fair","Good","Very Good","Premium","Ideal"),
Price=c(4300,3800,3950,4700,3500))
#排序方法1:基于数据框data.frame
library(dplyr)
mydata2<-arrange(mydata,desc(Price))
mydata$Cut <- factor(mydata$Cut, levels = mydata2$Cut)
ggplot(data=mydata,aes(Cut,Price))+
geom_bar(stat = "identity", width = 0.8,
colour="black",size=0.25,fill="#FC4E07",alpha=1)
#排序方法2:基于向量vector
order<-sort(mydata$Price,index.return=TRUE,decreasing = TRUE)
mydata$Cut <- factor(mydata$Cut, levels = mydata$Cut[order$ix])
ggplot(data=mydata,aes(Cut,Price))+
geom_bar(stat = "identity", width = 0.8,
colour="black",size=0.25,fill="#FC4E07",alpha=1)
#---------------------------双数剧系列柱形图----------------------------------------------------
library(reshape2)
mydata<-read.csv("MultiColumn_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata$Catergory<- factor(mydata$Catergory, levels = mydata$Catergory[order(mydata$X1996,decreasing = TRUE)])
mydata<-melt(mydata,id.vars='Catergory')
ggplot(data=mydata,aes(Catergory,value,fill=variable))+
geom_bar(stat="identity", color="black", position=position_dodge(),width=0.7,size=0.25)+
scale_fill_manual(values=c("#00AFBB", "#FC4E07", "#E7B800"))+
ylim(0, 10)+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.background =element_blank(),
legend.position = c(0.88,0.88)
)
#-------------------------------堆积柱形图-------------------------------------------------------
mydata<-read.csv("StackedColumn_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
sum<-sort(rowSums(mydata[,2:ncol(mydata)]),index.return=TRUE)
colsum<-sort(colSums(mydata[,2:ncol(mydata)]),index.return=TRUE,decreasing = TRUE)
mydata<-mydata[,c(1,colsum$ix+1)]
mydata$Clarity <- factor(mydata$Clarity, levels = mydata$Clarity[order(sum$ix)])
mydata<-melt(mydata,id.vars='Clarity')
ggplot(data=mydata,aes(variable,value,fill=Clarity))+
geom_bar(stat="identity",position="stack", color="black", width=0.7,size=0.25)+
scale_fill_manual(values=brewer.pal(9,"YlOrRd")[c(6:2)])+
ylim(0, 15000)+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.background =element_blank(),
legend.position = c(0.85,0.82)
)
#------------------------------百分比堆积柱形图-------------------------------------------------------
mydata<-read.csv("StackedColumn_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
Per<-(as.matrix(mydata[5,2:ncol(mydata)])) / t(as.matrix(colSums(mydata[,2:ncol(mydata)])))
Ideal<-sort(as.numeric(Per),index.return=TRUE,decreasing = TRUE)
mydata<-mydata[,c(1,Ideal$ix+1)]
mydata$Clarity <- factor(mydata$Clarity, levels = mydata$Clarity[c(1:5)])
mydata<-melt(mydata,id.vars='Clarity')
ggplot(data=mydata,aes(variable,value,fill=Clarity))+
geom_bar(stat="identity", position="fill",color="black", width=0.8,size=0.25)+
scale_fill_manual(values=brewer.pal(9,"GnBu")[c(7:2)])+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.position = "right"
)
)。使用geom_bar()函数绘制柱形图时,position的参数有4种。(1)identity:不做任何位置调整,该情况在多分类柱形图中不可行,序列间会遮盖,但是在多序列散点图、折线图中即可行,不存在遮盖问题;(2)stack:垂直堆叠放置(堆积柱形图);(3)dodge:水平抖动放置(簇状柱形图,position=position_dodge());(4)fill:百分比化(垂直堆叠放置,如百分比堆积面积图、百分比堆积柱形图等)。
3.1.1 单数据系列柱形图
一句话:单数据系列柱形图:类别或序数作X轴,数值作Y轴,序数数据直接按序画。
分别对应排序调整前和调整后的单数据系列柱形图。如前面所说,数据类型大致可以分为:类别型、序数型和数值型。柱形图的X轴变量一般为类别型和序数型,Y轴变量为数值型。
对于X轴变量为序数型的情况,直接按顺序绘制柱形图即可,如
的X轴为Fair、Good、VeryGood、Premium、Ideal(一般、好、非常好、超级好、完美)的顺序。最常见的序数型数据还包括时序数据,如年、月(January、February、March、April、May、June、July、August、September、October、November、December)日等。但是,如果X轴变量为类别型,则一般推荐对数据进行降序处理后,再展示图表,如
(a)所示(假定
的X轴变量为类别型)。这样,更加方便观察数据规律,确定某个类别对应的数值在整个数据范围的位置。对于X轴变量为类别型的数据,使用ggplot2包绘图时,会默认将X轴类别按照字母顺序绘制柱形,如
所示。这是因为绘图不是根据X轴变量的因子向量顺序排列展示的,而是根据因子向量的水平按顺序展示的。因子向量(factor)包括向量(vector)和水平(level)两个部分,比如:
需要注意的是:只排序数据框,而不改变X轴因子向量的水平顺序,并不会改变柱形图的绘制顺序。在R中表格的排序主要有两种方法:Base包的order()函数(用于对向量排序)和dplyr包的arrange()函数(用于对数据框根据某列数据排序),具体语句分别如下:
所示的新表格,虽然对表格数据排序,但是并没有改变因子向量的水平顺序。在使用geom_bar()函数绘制时,还是根据水平的原有顺序绘制柱形图的,如
所示。在R语言中,要实现X轴变量的降序展示(见
),需要通过控制并改变因子向量的水平实现。我们一定要先对表格或因子向量排序后,再改变其水平顺序,才会使X轴的类别顺序根据Y轴变量的数值降序展示,具体语句如下:
所示。团(b)直接对表格进行排序后的表格技能单数据系列柱形图R的ggplot2包中提供了柱形图系列绘制的函数:geom_bar()。其中stat和position的参数都为identity,width控制柱形的宽度,范围为(0,1)。
其中,
单数据系列柱形图的实现代码如下所示
3.1.2 多数据系列柱形图
一句话:多数据系列:先melt转长表再画,分簇/堆积展示多组对比。
对于如
所示的多数据系列柱形图,图表绘制的关键在于将原始数据的二维表(见
)转换成一维表(见
)。在R语言中,使用reshape2包的melt()函数或者tidyr包的gather()函数可以把二维表转换成一维表。对于多数据系列柱形图,最好将表格根据第1个数据系列的数值进行降序处理,然后再展示。
所示为根据数据第1个系列“1996降序展示表格,所以要使用sort()和factor()函数处理表格。7.674.02
3.1.3 堆积柱形图
一句话:堆积柱形图:单柱内按比例堆叠,看每类占总数的贡献。
堆积柱形图显示单个项目与整体之间的关系,它比较各个类别的每个数值所占总数值的大小。堆积柱形图以二维垂直堆积矩形显示数值。在
中,要注意两点:(1)柱形图的X轴变量一般为类别型,Y轴变量为数值型。所以要先求和得到每个类别的总和数值,然后对数据进行降序处理。(2)图例的变量属于序数型,为Fair、Good、VeryGood、Premium、Ideal(一般、好、非常好、超级好、完美)的顺序,需要按顺序显示图例。
技能堆积柱形图R中的ggplot2包提供了柱形图系列绘制的函数:geom bar()。其中position设定为"stack”。图3-1-2(c)多数据系列柱形图的具体实现代码如下所示。
mydata<-read.csv("StackedColumn_Data.csv")Order<-sort(colSums(mydata[,2:ncol(mydata)]).index.return=TRUE,decreasing=TRUE)#根据列求和结果对数据排序mydata<-mydata[.c(1,Order$ix+1)]#根据列求和结果对表格排序mydata$Clarity<-factor(mydata$Clarity,levels=mydata$Clarity[c(1:5)))#由于输入时就已经按顺序导入表格,所以只需要保持固有的排序即可mydata<-melt(mydata,id.vars=Clarity)geom_bar(stat="identity"position="stack",color=“black",width=0.7,size=0.25)
3.1.4 百分比堆积柱形图
一句话:百分比堆积柱形图:全柱等高=100%,直接比较各类占比。
百分比堆积柱形图和三维百分比堆积柱形图表达相同的图表信息。这些类型的柱形图用于比较各个类别的数值所占总数值的百分比大小。百分比堆积柱形图以二维垂直百分比堆积矩形显示数值。
中,要注意两点:(1)柱形图的X轴变量一般为类别型,Y轴变量为数值型。所以要先求重点想展示类别的占比(如Ideal数据系列,一般推荐为占比最大的数据系列),然后对数据进行降序处理。(2)图例的变量属于序数型,为Fair、Good、VeryGood、Premium、Ideal(一般、好、非常好、超级好、完美)的顺序,需要按顺序显示图例。
技能百分比堆积柱形图R中的ggplot2包提供了柱形图系列绘制的函数:geom_bar()。其中position设定为"fill"。图3-1-2(d)百分比堆积柱形图的具体实现代码如下所示。
mydata<-read.csv("StackedColumn_Data.csv")Per<-(as.matrix(mydata[5.2:ncol(mydata))/t(as.matrix(colSums(mydata[,2:ncol(mydata))Ideal<-sort(as.numeric(Per)index.return=TRUE,decreasing=TRUE)mydata<-mydata[c(1,ldeal$ix+1)]mydata<-melt(mydata,id.vars='Clarity)geom_bar(stat="identity",position="fill",color="black",width=0.8,size=0.25)
3.2 条形图系列
一句话:条形图=柱形图横过来:类别名长时更合适,强调项目间大小。
簇状条形图与簇状柱形图类似,几乎可以表达相同多的数据信息。在条形图中,类别型或序数型变量映射到纵轴的位置,数值型变量映射到矩形的宽度。条形图的柱形变为横向,与柱形图相比,条形图更加强调项目之间的大小。
尤其在项目名称较长及数量较多时,采用条形图可视化数据会更加美观、清晰。在使用R中的ggplot2包绘制的条形图中,Y轴变量和图例变量默认按照字母顺序绘制,可以参照3.1节的代码实现。只需要添加ggplot2包的coordflip()语句,就可以将X-Y坐标轴旋转,从而将柱形图转换成条形图(见
条形图系列.png)
条形图系列.png)
条形图系列.png)
条形图系列.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
#---------------------------单数剧系列条形图----------------------------------------------------
mydata<-read.csv("Stackedbar_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata$Country <- factor(mydata$Country, levels = mydata$Country[order(mydata$Pensions)])
ggplot(data=mydata,aes(Country,Pensions))+
geom_bar(stat="identity", color="black", width=0.6,fill="#FC4E07",size=0.25) +#"#00AFBB"
scale_fill_manual(values=brewer.pal(9,"YlOrRd")[c(6:2)])+
coord_flip()+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=13,face="plain",color="black"),
legend.position = "right"# c(0.83,0.15)
)
#---------------------------双数剧系列条形图----------------------------------------------------
library(reshape)
mydata<-read.csv("Stackedbar_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata<-mydata[,c(1,3,2)]
mydata$Country <- factor(mydata$Country, levels = mydata$Country[order(mydata$Pensions)])
mydata<-melt(mydata,id.vars='Country')
ggplot(data=mydata,aes(Country,value,fill=variable))+
geom_bar(stat="identity", color="black", position=position_dodge(),width=0.7,size=0.25)+
scale_fill_manual(values=c("#00AFBB", "#FC4E07", "#E7B800"))+
coord_flip()+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black"),
legend.background =element_blank(),
legend.position = c(0.83,0.12)
)
#-------------------------------堆积条形图-------------------------------------------------------
mydata<-read.csv("Stackedbar_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
rowsum<-sort(rowSums(mydata[,2:ncol(mydata)]),index.return=TRUE)
mydata$Country <- factor(mydata$Country, levels = mydata$Country[order(rowsum$ix)])
mydata<-melt(mydata,id.vars='Country')
ggplot(data=mydata,aes(Country,value,fill=variable))+
geom_bar(stat="identity",position="stack", color="black", width=0.65,size=0.25)+
scale_fill_manual(values=brewer.pal(9,"YlOrRd")[c(6:2)])+
ylim(0, 35)+
coord_flip()+
theme(
#text=element_text(size=15,face="plain",color="black"),
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=13,face="plain",color="black"),
legend.position = "right"# c(0.83,0.15)
)
#------------------------------百分比堆积柱形图-------------------------------------------------------
mydata<-read.csv("Stackedbar_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
sum<-sort(rowSums(mydata[,2:ncol(mydata)]),index.return=TRUE)
mydata$Country <- factor(mydata$Country, levels = mydata$Country[order(sum$ix)])
mydata<-melt(mydata,id.vars='Country')
library(RColorBrewer)
ggplot(data=mydata,aes(Country,value,fill=variable))+
geom_bar(stat="identity",position="fill", color="black", width=0.65,size=0.25)+
scale_fill_manual(values=brewer.pal(9,"GnBu")[c(7:2)])+
coord_flip()+
theme(
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
legend.title=element_text(size=13,face="plain",color="black"),
legend.position = "right"
)
3.3 不等宽柱形图
一句话:不等宽柱形图:柱高+柱宽同时表达两个变量,双维度比较。
有的时候,我们需要在柱形图中同时表达两个维度的数据,除了每个柱形的高度表达了某个对象的数值大小(Y轴纵坐标),还希望柱形的宽度也能表达该对象的另外一个数值大小(X轴横坐标),以便直观地比较这两个维度。这时可以使用不等宽柱形图(variablewidthcolumnchart)来展示数据,如

#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(Cairo)
library(showtext)
mydata<-data.frame(Name=paste0("Project",1:5),Scale=c(35,30,20,10,5),ARPU=c(56,37,63,57,59))
mydata$xmin<-0
for (i in 2:5){
mydata$xmin[i]<-sum(mydata$Scale[1:i-1])
}
#构造矩形X轴的终点(最大点)
for (i in 1:5){
mydata$xmax[i]<-sum(mydata$Scale[1:i])
}
#构造数据标签的横坐标:
for (i in 1:5){
mydata$label[i]<-sum(mydata$Scale[1:i])-mydata$Scale[i]/2
}
#CairoPDF(file="不等宽柱形图.pdf",width=4.89,height=5.53)
#showtext.begin()
#windowsFonts(myFont = windowsFont("微软雅黑"))
ggplot(mydata)+
geom_rect(aes(xmin=xmin,xmax=xmax,ymin=0,ymax=ARPU,fill=Name),colour="black",size=0.25)+
geom_text(aes(x=label,y=ARPU+3,label=ARPU),size=4,col="black")+
geom_text(aes(x=label,y=-2.5,label=Name),size=4,col="black")+
ylab("ARPU")+
xlab("scale")+
ylim(-5,80)+
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),
plot.title=element_text(size=15,hjust=.5),#family="myfont",
legend.position="none"
)
#showtext.end()
#dev.off()
所示。不等宽柱形图是常规柱形图的一种变化形式,它用柱形的高度反映一个数值的大小,同时用柱形的宽度反映另一个数值的大小,多用于市场调查研究、维度分析等方面。技能不等宽柱形图R中的ggplot2包提供了绘制矩形的函数:geom_rect()。
geom_rect()函数可以根据右下角坐标(xmin,ymin)和左上角坐标(xmax,ymax)绘制矩形,矩形的宽度(width)为max~xmin对应X轴变量的数值大小;矩形的高度(height)为ymax~ymin对应Y轴变量的数值大小。
不等宽柱形图的具体实现代码如下所示。#构造矩形X轴的起点(最小点)mydata$xmin[]<-sum(mydata$Scale[1:i-1])#构造矩形×轴的终点(最大点)mydata$xmax[i]<-sum(mydata$Scale[1:i]}#构造数据标签的横坐标mydata$labeli]<-sum(mydata$Scale[1:i])-mydata$Scale[]/2}geom_rect(aes(xmin=xmin,xmax=xmax.ymin=0.ymax=ARPU,fil=Name),colour="black"size=0.25)+geom_text(aes(x=label.y=ARPU+3,label=ARPU),size=4,col="black")+geom_text(aes(x=label.y=-2.5,label=Name),size=4.col="black")
3.4 克利夫兰点图系列
一句话:克利夫兰点图:类别很多时的紧凑方案,点比柱省空间。
克利夫兰点图系列.png)
克利夫兰点图系列.png)
克利夫兰点图系列.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(reshape2)
#-------------------------------- (a)棒棒糖图 ----------------------------------------------
mydata<-read.csv("DotPlots_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata$sum<-rowSums(mydata[,2:3])
order<-sort(mydata$sum,index.return=TRUE,decreasing = FALSE)
mydata$City<- factor(mydata$City, levels = mydata$City[order$ix])
ggplot(mydata, aes(sum, City)) +
geom_segment(aes(x=0,
xend=sum,
y=City,
yend=City))+
geom_point(shape=21,size=3,colour="black",fill="#FC4E07")+
theme(
axis.title=element_text(size=13,face="plain",color="black"),
axis.text = element_text(size=10,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black")
)
#-------------------------------- (b) 克利夫兰点图 ----------------------------------------------
mydata<-read.csv("DotPlots_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata$sum<-rowSums(mydata[,2:3])
order<-sort(mydata$sum,index.return=TRUE,decreasing = FALSE)
mydata$City<- factor(mydata$City, levels = mydata$City[order$ix])
ggplot(mydata, aes(sum, City)) +
geom_point(shape=21,size=3,colour="black",fill="#FC4E07")+
theme(
axis.title=element_text(size=13,face="plain",color="black"),
axis.text = element_text(size=10,face="plain",color="black"),
legend.title=element_text(size=14,face="plain",color="black")
)
#----------------------------------(c) 哑铃图------------------------
mydata<-read.csv("DotPlots_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
mydata$City <- factor(mydata$City, levels = mydata$City[order(mydata$Female)])
mydata<-melt(mydata,id.vars='City')
ggplot(mydata, aes(value,City,fill=variable)) +
geom_line(aes(group = City)) +
geom_point(shape=21,size=3,colour="black")+
scale_fill_manual(values=c("#00AFBB", "#FC4E07","#36BED9"))+
theme(
axis.title=element_text(size=13,face="plain",color="black"),
axis.text = element_text(size=10,face="plain",color="black"),
legend.title=element_text(size=12,face="plain",color="black"),
legend.background = element_blank(),
legend.position = c(0.85,0.12)
)
所示为三种不同类型的图表,但其在本质上都可以看成是克利夫兰点图,所以就归纳成同一类别。棒棒糖图(lollipopchart):棒棒糖图传达了与柱形图或者条形图相同的信息,只是将矩形转变成线条,这样可减少展示空间,重点放在数据点上,从而看起来更加简洁、美观。相对柱形图与条形图,棒棒糖图更加适合数据量比较多的情况。
为横向棒棒糖图,对应条形图:而如果是纵向棒棒糖图则对应柱形图。克利夫兰点图(Cleveland'sdotplot):也就是我们常用的滑珠散点图,非常类似棒棒糖图,只是没有连接的线条,重点强调数据的排序展示及互相之间的差距,如
(b)所示。克利夫兰点图一般都横向展示,所以Y轴变量一般为类别型变量。哑铃图(dumbbellplot):可以看成多数据系列的克利夫兰点图,只是使用直线连接了两个数据系列的数据点。
哑铃图主要用于:①展示在同一时间段两个数据点的相对位置(增加或者减少):②比较两个类别之间的数据值差别。
是展示了男性(Male)和女性(Female)两个类别的数值差别,以女性数据系列的数值排序显示。心技能棒棒糖图R中的ggplot2包提供了散点绘制函数geom_point()及连接线函数geom_segment()。其中geom_segment()函数根据起点坐标(x,y)和终点坐标(xend,yend)绘制两者之间的连接线,棒棒糖图的连接线为平行于X轴水平绘制,其长度(length)对应X轴变量的数值。
棒棒糖图的具体实现代码如下所示。而
克利夫兰点图就是在棒棒糖图的基础上只保留散点实现的
哑铃图的实现代码如下所示
3.5 坡度图
一句话:坡度图:两个时点/条件下各类别数值的变化,升跌一眼看出。
坡度图(slopechart)可以看成是一种多数据系列的折线图,可以很好地用于比较在两个不同时间或者两个不同实验条件下,某些类别变量的数据变化关系。
坡度图.png)
坡度图.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(scales)
library(reshape)
#--------------------------------------(a)两年份对比---------------------------------------------------------------
df <- read.csv("Slopecharts_Data1.csv")
colnames(df) <- c("continent", "1952", "1957")
left_label <- paste(df$continent, round(df$`1952`),sep=", ")
right_label <- paste(df$continent, round(df$`1957`),sep=", ")
df$class <- ifelse((df$`1957` - df$`1952`) < 0, "red", "green")
p <- ggplot(df) +
geom_segment(aes(x=1, xend=2, y=`1952`, yend=`1957`, col=class), size=.75, show.legend=F) + #连接线
geom_vline(xintercept=1, linetype="solid", size=.1) + # 1952年的垂直直线
geom_vline(xintercept=2, linetype="solid", size=.1) + # 1957年的垂直直线
geom_point(aes(x=1, y=`1952`), size=3,shape=21,fill="grey80",color="black") + # 1952年的数据点
geom_point(aes(x=2, y=`1957`), size=3,shape=21,fill="grey80",color="black") + # 1957年的数据点
scale_color_manual(labels = c("Up", "Down"), values = c("green"="#A6D854","red"="#FC4E07")) +
xlim(.5, 2.5)
# 添加文本信息
p <- p + geom_text(label=left_label, y=df$`1952`, x=rep(1, NROW(df)), hjust=1.1, size=3.5)
p <- p + geom_text(label=right_label, y=df$`1957`, x=rep(2, NROW(df)), hjust=-0.1, size=3.5)
p <- p + geom_text(label="1952", x=1, y=1.02*(max(df$`1952`, df$`1957`)), hjust=1.2, size=5)
p <- p + geom_text(label="1957", x=2, y=1.02*(max(df$`1952`, df$`1957`)), hjust=-0.1, size=5)
p<-p+theme_void()
p
#-------------------------------------(b)多年份对比---------------------------------------------------------------------------------
library(ggalt)
df <- read.csv("Slopecharts_Data2.csv")
colnames(df) <- c("continent", 2007:2013)
df2<-melt(df, id="continent")
df2$value<-as.numeric(df2$value)
df2$variable<-as.numeric(df2$variable)
left_label<-paste(df2$continent, round(df2$value),sep=", ")
right_label<-paste(df2$continent, round(df2$value),sep=", ")
left_point<-df2$value
right_point<-df2$value
class<-df2$variable
for (i in 1:nrow(df2))
{
if (df2$variable[i]!=1)
{
left_label[i]<-""
left_point[i]<-NaN
}
if (df2$variable[i]!=7)
{
right_label[i]<-""
right_point[i]<-NaN
}
if (df[df$continent==df2$continent[i],2]>df[df$continent==df2$continent[i],8])
{
class[i]<-"green"
}
else
{
class[i]<-"red"
}
}
p <- ggplot(df2) +
geom_xspline(aes(x=variable, y=value,group=continent, colour=class),size=.75) +
geom_vline(xintercept=1, linetype="solid", size=.1) +
geom_vline(xintercept=7, linetype="solid", size=.1) +
geom_point(aes(x=variable, y=left_point), size=3,shape=21,fill="grey80",color="black") +
geom_point(aes(x=variable, y=right_point), size=3,shape=21,fill="grey80",color="black") +
scale_color_manual(labels = c("Up", "Down"), values = c("green"="#FC4E07", "red"="#A6D854")) +
xlim(-4, 12)
p <- p + geom_text(label=left_label, y=df2$value, x=rep(1, NROW(df2)), hjust=1.1, size=3.5)
p <- p + geom_text(label=right_label, y=df2$value, x=rep(7, NROW(df2)), hjust=-0.1, size=3.5)
p <- p + geom_text(label="2007", x=1, y=1.02*(max(df2$value)), hjust=1.2, size=5) # title
p <- p + geom_text(label="2013", x=7, y=1.02*(max(df2$value)), hjust=-0.1, size=5) # title
p<-p+theme_void()+
theme(legend.position = "none")
p
展示了1952年和1957年两年的数据变化情况,直接使用直线连接这两个年份不同国家或地区的数据点,同时用绿色和红色标注增长和降低的国家或地区的数据,这样可以很清晰地对比不同国家或地区的数值变化情况。
展示了2007年到2013年总共7年的数据变化情况,使用曲线将每个国家或地区7年的数据连接,但是重点展示第一年(2007年)和最后一年(2013年)的数据点,同时用绿色和红色标注增长和降低的国家或地区的数据,这样可以很清晰地对比不同国家或地区的数值变化情况。技能坡度图R中的ggplot2包提供了geom_segment()函数可以绘制两点之间的直线,geom_point()函数可以绘制两根直线上的数据点。
坡度图的具体代码如下所示。
的实现代码的主要区别主要有两个(1)先把读入的数据框,使用melt()函数根据“continent”列融合,再计算左标签(leftlabel)右标签(rightlabel)和类别(class);(2)两点之前的连接线函数使用geom_xspline()替代geom_segment(),因为geom_segment()函数只能使用直线连接两点,而geom_xspline()函数可以使光滑的曲线连接多个数据点
3.6 南丁格尔玫瑰图
一句话:南丁格尔玫瑰图:极坐标柱形图,环形数据或强调展示效果时用。
南丁格尔玫瑰图(Nightingalerosechart,也被称为coxcombchart、polarareadiagram)即极坐标柱形图,是一种圆形的柱形图。由弗罗伦斯·南丁格尔所发明,普通柱形图的坐标系是直角坐标系,而南丁格尔玫瑰图的坐标系是极坐标系。南丁格尔玫瑰图是在极坐标下绘制的柱形图,使用圆弧的104IR语言数据可视化之美:专业图表绘制指南半径长短表示数据的大小(数量的多少)。
每个数据类别或间隔在径向图上划分为相等分段,每个分段从中心延伸多远(与其所代表的数值成正比)取决于极坐标轴线。因此,从极坐标中心延伸出来的每一环可以当作标尺使用,用来表示分段大小并代表较高的数值,如
所示。(1)由于半径和面积是平方的关系,南丁格尔玫瑰图会将数据的比例大小夸大,所以适合对比大小相近的数值。(2)由于圆形有周期的特性,所以南丁格尔玫瑰图特别适用于X轴变量是环状周期型序数的情况,比如月份、星期、日期等,这些都是具有周期性的序数型数据。
(3)南丁格尔玫瑰图是将数据以圆形排列展示,而柱形图是将数据横向排列展示。所以在数据量比较多时,使用南丁格尔玫瑰图更能节省绘图空间。南丁格尔玫瑰图的主要缺点在于面积较大的外围部分会更加引人注目,这跟数值的增量成反比。
技能单数据系列南丁格尔玫瑰图在R中,从直角坐标系(
)转到极坐标系(
(b)),只需要添加一条坐标系的语句:coord_polar(theta=“x"start-0),其中theta表示是将X轴或Y轴映射到极坐标系。
极坐标柱形图系列.png)
_极坐标柱形图系列.png)
_极坐标柱形图系列.png)
_极坐标柱形图系列.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
#----------------------------------单数据系列极坐标柱形图-----------------------------------------
mydata <- data.frame( a=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"),
b=c(50, 60, 70, 20,90,110,30))
myAngle <-seq(-20,-340,length.out =7)
ggplot(mydata) +
geom_bar(aes(x=a, y=b),width = 1,stat="identity",
colour = "black",fill="#F8766D") +
geom_text(aes(x=a,y = b-8,label = b),color="white") +
coord_polar(theta = "x",start=0) +
ylim(c(0,120))+
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 12,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 13,colour="black",angle = myAngle))
#--------------------------------多数据系列极坐标柱形图-------------------------------------------
diamonds<-cbind(diamonds,Cou=rep(1,nrow(diamonds)))
sum_clarity<-aggregate(Cou~clarity,diamonds,sum)
sort_clarity<-arrange(sum_clarity,desc(Cou))
diamonds$clarity<- factor(diamonds$clarity, levels = sort_clarity$clarity)
myAngle <-seq(-20,-340,length.out = 8)
ggplot(diamonds,aes(x=clarity,fill=color))+
geom_bar(width=1.0,colour="black",size=0.25)+
coord_polar(theta = "x",start=0)+
scale_fill_brewer(palette="GnBu")+
guides(fill=guide_legend(reverse=TRUE,title=NULL))+
ylim(c(0,12000))+
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 12,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 13,colour="black",angle = myAngle))
ggplot(diamonds,aes(x=clarity,fill=color))+
geom_bar(width=1.0,colour="black",size=0.25)+
coord_polar(theta = "x",start=0)+
scale_fill_brewer(palette="Reds")+
guides(fill=guide_legend(reverse=TRUE,title="Color"))+
ylim(c(-2000,12000))+
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 12,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 13,colour="black",angle = myAngle))
(a)的X轴坐标为时间序列型,所以就是根据X轴时间顺序展示数据的,其实现代码如下所示
(b)多数据系列南丁格尔玫瑰图的X轴坐标为类别型变量,所以就是根据Y轴数值排序后展示数据的,这个原理与堆积柱形图类似。根据处理后的数据绘制堆积柱形图后,添加语句coord_polar(theta="x",start=0),就可以把直角坐标系转换成极坐标系,其实现代码如下所示
弗罗伦斯·南丁格尔主动申请,自愿担任战地护士。她率领38名护士抵达前线,在战地医院服务。当时的野战医院卫生条件极差,各种资源极度匮乏,她竭尽全力排除各种困难,为伤员解决必需的生活用品和食品问题,对他们进行认真的护理。
仅仅半年左右,伤病员的死亡率就下降到2.2%。每个夜晚,她都手执风灯巡视,伤病员们亲切地称她为“提灯女神”。战争结束后,南丁格尔回到英国,被人们推崇为民族英雄。
出于对资料统计的结果不受人重视的忧虑,她发展出一种色彩缤纷的图表形式,让数据能够更加让人印象深刻(见
)。这种图表形式有时也被称作“南丁格尔的玫瑰“,是一种圆形的直方图。南丁格尔自己常昵称这类图为鸡冠花(coxcomb)图,并且用以表达军队医院季节性的死亡率,对象是那些不太能理解传统统计报表的公务人员。
她的方法打动了当时的高层,包括军方人士和维多利亚女王本人,于是医事改良的提案才得到支持。BLAGRAMrTECAUSRSeM()RTALITY
3.7 径向柱形图
一句话:径向柱形图:同心圆网格上的柱形图,视觉冲击力强。
径向柱形图也被称为圆形柱形图或星图。这种图表使用同心圆网格来绘制条形图,如
径向柱图.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(RColorBrewer)
df <- data.frame(item=rep(LETTERS[1:10], 5),
score=rep(letters[1:5], each=10),
value=rep((1:5), each=10) + rnorm(50, 0, .5))
myAng <-seq(-20,-340,length.out =10)
ggplot(data=df,aes(item,value,fill=score))+
geom_bar(stat="identity", color="black", position=position_dodge(),width=0.7,size=0.25)+
coord_polar(theta = "x",start=0) +
ylim(c(-3,6))+
scale_fill_brewer(palette="YlGnBu")+
theme_light()+
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 12,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 13,colour="black",angle = myAng))
所示。每个圆圈表示一个数值刻度,而径向分隔线(从中心延伸出来的线)则用作区分不同类别或间隔(如果是直方图)。刻度上较低的数值通常由中心点开始,然后数值会随着每个圆形往外增加,但也可以把任何外圆设为零值,这样里面的内圆就可用来显示负值。
条形通常从中心点开始向外延伸,但也可以在别处为起点显示数值范围(如跨度图)。此外,条形也可以如堆叠式条形图般堆叠起来。技能径向柱形图径向柱形图的绘制方法其实与极坐标柱形图的绘制方法基本类似,也是将直角坐标系转换成极坐标系,只是使Y轴坐标不从0开始,关键的语句在于设定Y轴的坐标范围ylim(ymin,ymax),ymin和ymax分别表示Y轴的最小值和最大值。
多数据系列的径向柱形图就是将直角坐标系转换成极坐标系,然后将Y轴设定从负值开始,其实现代码如下所示
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
library(viridis)
df<-read.csv("PloarRange_Data.csv",sep=",",na.strings="NA",stringsAsFactors=FALSE)
df$date<-as.Date(df$date)
myAngle <-seq(-20,-340,length.out = 12)
ggplot(df, aes(date,
ymin = min.temperaturec,
ymax = max.temperaturec,
color = mean.temperaturec)) +
geom_linerange(size = 1.3, alpha = 0.75) +
scale_color_viridis("Temperature", option = "D") +
scale_x_date(labels = date_format("%m"), breaks = date_breaks("month")) +
ylim(-10, 35) +
coord_polar() +
theme_light() +
theme( panel.background = element_blank(),
panel.grid.major = element_line(colour = "grey80",size=.25),
axis.text.y = element_text(size = 12,colour="black"),
axis.line.y = element_line(size=0.25),
axis.text.x=element_text(size = 13,colour="black",angle = myAngle))
所示。技能极坐标跨度图R中的ggplot2包提供了线性范围函数:geom_linerange(),主要包括三个参数(x,ymin,ymax),分别对应X轴数值、Y轴最小值和最大值。
的具体实现代码如下所示:
3.8 雷达图
一句话:雷达图:多变量同时比较,看哪些变量相似、谁高谁低。
雷达图(radarchart),又被称为蜘蛛图、极地图或星图。雷达图是用来比较多个定量变量的方法,可用于查看哪些变量具有相似数值,或者每个变量中有没有任何异常值。此外,雷达图也可用于查看数据集中哪些变量得分较高/低,是显示性能表现的理想之选。
每个变量都具有自己的轴(从中心开始)。所有的轴都以径向排列,彼此之间的距离相等,所有轴都有相同的刻度。轴与轴之间的网格线通常只作指引用途。
每个变量数值会画在其所属轴线之上,数据集内的所有变量将连在一起形成一个多边形。然而,雷达图有一些重大缺点:(1)在一个雷达图中使用多个多边形,会令图表难以阅读,而且相当混乱。特别是如果用颜色填满多边形,表面的多边形则会覆盖下面的其他多边形。
(2)过多变量也会导致出现太多的轴线,使图表变得复杂,难以阅读,故雷达图只能保持简单,因而限制了可用变量的数量。(3)它未能很有效地比较每个变量的数值。即使借助蜘蛛网般的网格指引,也不如在直线轴上比较数值容易。
接下来以数据集labeldata为例讲解雷达图的绘制方法:其中,car和vlaue列是实际的X轴和Y轴变量,id为辅助的绘图变量,为1~N的等差数列(N为数据框的总行数)。·在R的直角坐标系下,直接使用geom_path()函数绘制的折线图,或者使用geom_polygon()函数绘制的多边形图,在将其转换成极坐标系时,得到的图表如
.png)
.png)
.png)
.png)
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
#--------------------------------------------雷达图实现原理-------------------------------------------------------
#Reference:https://github.com/cardiomoon/ggplot2new/blob/4e50b7dcfee3246a169702f88f7dd46cbf933f4b/coord_radar.R
coord_radar <- function (theta = "x", start = 0, direction = 1)
{ theta <- match.arg(theta, c("x", "y"))
r <- if (theta == "x")
"y"
else "x"
ggproto("CoordRadar", CoordPolar, theta = theta, r = r, start = start,
direction = sign(direction),
is_linear = function(coord) TRUE)}
#----------------------------------------单数据系列--------------------------------------------------------------
label_data<-data.frame(car=c("Math" , "English" , "Biology" , "Music" , "R-Coding" ),
id=c(1:5) ,
value=c(12 , 2 ,14 ,20, 18))
AddRow<-c(NA,nrow(label_data)+1,label_data[1,ncol(label_data)])
mydata<-rbind(label_data,AddRow)
myAngle<- 360- 360 * (label_data$id-1) /nrow(label_data)
ggplot() +
geom_polygon(data=mydata,aes(x=id, y=value),color = "black", fill=brewer.pal(7,"Set1")[1],alpha=0.1)+
geom_point(data=mydata,aes(x=id, y=value),size=5,shape=21,color = 'black', fill=brewer.pal(7,"Set1")[1])+
coord_polar() + #实现为图3-8-1(c) 的圆形雷达图
ylim(0,22)+
theme_light()+
theme(axis.text.x=element_text(size = 11,colour="black"))
ggplot() +
geom_polygon(data=mydata,aes(x=id, y=value),color = "black", fill=brewer.pal(7,"Set1")[1],alpha=0.1)+
geom_point(data=mydata,aes(x=id, y=value),size=5,shape=21,color = 'black', fill=brewer.pal(7,"Set1")[1])+
coord_polar() + #实现为图3-8-1(c) 的圆形雷达图
#coord_radar()+ #
scale_x_continuous(breaks =label_data$id,labels=label_data$car)+
ylim(0,22)+
theme_light()+
theme(axis.text.x=element_text(size = 11,colour="black",angle = myAngle))
所示。其出现的问题是起点和终点会绘制在同一X轴位置。其核心语句如下:geom_polygon(color="black",fil=brewer.pal(7."Set1")[1].alpha=0.1)+geom_point(size=5,shape=21.color=“black,fil=brewer.pal(7,Set1")[1])+这时,可以在原始数据框的末尾添加第一行的数据:
(b)所示的带平滑线的雷达图。但是其存在的问题是X轴坐标标签并没有与实际的X轴的数据对应。在
(b)的基础上,使用scale_x_continuous()函数可以将X轴坐标标签替换成car列的数值,具体语句如下:scale_x_continuous(breaks=label_data$id,labels=label_data$car)这样,就可以得到如
所示的带平滑曲线的雷达图。如果要得到
所示的直线连接的雷达图,则只需要将极坐标系的coord_polar()函数修改成自定义的雷达坐标系的coord_radar()函数即可。技能雷达图系列R中的fmsb包提供了radarchart()函数,可以绘制标准的雷达图;使用ggplot2包的geom_polygon()函数或者geom_path()函数,同时借助自制的辅助函数coord_radar(),可以实现
#EasyCharts团队出品,
#如有问题修正与深入学习,可联系微信:EasyCharts
library(ggplot2)
#--------------------------------------------雷达图实现原理-------------------------------------------------------
#coord_radar-Reference:
#https://github.com/cardiomoon/ggplot2new/blob/4e50b7dcfee3246a169702f88f7dd46cbf933f4b/coord_radar.R
coord_radar <- function (theta = "x", start = 0, direction = 1)
{ theta <- match.arg(theta, c("x", "y"))
r <- if (theta == "x")
"y"
else "x"
ggproto("CoordRadar", CoordPolar, theta = theta, r = r, start = start,
direction = sign(direction),
is_linear = function(coord) TRUE)}
#--------------------------------------------多数据系列-------------------------------------------------------
label_data<-data.frame(
car=c("biology" , "english" ,"math" , "music" , "R-coding" ),
id=c(1:5) ,
v1=sample( 0:20,5, replace=T),
v2=sample( 0:20,5, replace=T)
)
AddRow<-c(NA,nrow(label_data)+1,label_data[1,ncol(label_data)-1],label_data[1,ncol(label_data)])
mydata<-rbind(label_data,AddRow)
myAngle<- 360- 360 * (label_data$id-1) /nrow(label_data)
mydata<-melt(mydata,id=c("car", "id"))
ggplot(data=mydata,aes(x=id, y=value,group=variable,fill=variable)) +
geom_polygon(colour="black",alpha=0.1)+
geom_point(size=4,shape=21,color = 'black')+
coord_radar()+
#coord_polar() +
scale_x_continuous(breaks =label_data$id,labels=label_data$car)+
theme_bw() +
ylim(0,22)+
theme(axis.text.x=element_text(size = 11,colour="black",angle = myAngle),
axis.title=element_text(size=15,face="plain",color="black"),
axis.text = element_text(size=12,face="plain",color="black"),
panel.grid.major = element_line(color="grey80"),
axis.line = element_line(color="black"),
axis.ticks = element_line(color="black"))
所示的圆形雷达图,具体代码如下所示。但是使用coordpolar()函数替代coord_radar()函数,可以实现
所示的带平滑线的圆形雷达图。其中,geom_polygon()函数是根据给定的数据点依次连接形成封闭的多边形,而geom_path()函数则根据给定的数据点依次使用线条连接。#雷达坐标系的定义coord_radar<-function(theta ="x",start=0.direction=1){theta<-match.arg(theta,c("x","y"))direction =sign(direction),is_linear=function(coord)TRUE)}label_data<-data.frame(car=c(“Math",“English”,"Biology”,"Music","R-Coding"”)#添加一行辅助数据到绘图数据AddRow<-c(NA,nrow(label_data)+1.mydata1[1.ncol(label_data)])mydata<-rbind(label_data,AddRow)#坐标轴标签的角度设定angle()<-360*(label_data$id-1)/nrow(label data)myAngle<-ifelse(angle()>angle()[1],180-angle(),angle())geom_polygon(color=“black",fil=brewer.pal(7,"Set1")[1].alpha=0.1)+geom_point(size=5,shape=21,color=blackfill=brewer.pal(7,Set1"[1])+#coord_polar()+#实现为
极坐标系下的圆形雷达图coord_radar()+#实现为
雷达坐标系下的圆形雷达图scale_x_continuous(breaks=label_data$id,labels=label_data$car)+
3.9 词云图
一句话:词云图:词的大小=出现频率,文本数据一眼看出重点词。
词云图(wordcloudchart)是通过使每个字的大小与其出现频率成正比,显示不同单词在给定文本中的出现频率,然后将所有的字词排在一起,形成云状图案,也可以任何格式排列:水平线、垂直列或其他形状,如

所示。其也可用于显示获分配元数据的单词。在词云图上使用颜色通常都是毫无意义的,主要是为了美观,但我们可以用颜色对单词进行分类或显示另一个数据变量。
词云图通常用于网站或博客上,以描述关键字或标签使用,也可用来比较两个不同的文本。词云图虽然简单易懂,但有着一些重大缺点:(1)较长的字词会更引人注意;(2)字母含有很多升部/降部的单词可能会更受人关注;(3)分析精度不足,主要是为了美观。
是两篇文章Paper1和Paper2的词汇文本及其对应的频率。
#EasyShu团队出品,更多文章请关注微信公众号【EasyShu】
#如有问题修正与深入学习,可联系微信:EasyCharts
library(tm)
library(wordcloud)
Paper1<-paste(scan("Paper1.txt", what = character(0),sep = ""), collapse = " ") #读入TXT 文档1
Paper2<-paste(scan("Paper2.txt", what = character(0),sep = ""), collapse = " ") #读入TXT 文档2
tmpText<- data.frame(c(Paper1, Paper2),row.names=c("Text1","Text2"))
df_title <- data.frame(doc_id=row.names(tmpText),
text=tmpText$c.Paper1..Paper2.)
ds <- DataframeSource(df_title)
#创建一个数据框格式的数据源,首列是文档id(doc_id),第二列是文档内容
corp <- VCorpus(ds)
#加载文档集中的文本并生成语料库文件
corp<- tm_map(corp,removePunctuation) #清除语料库内的标点符号
corp <- tm_map(corp,PlainTextDocument) #转换为纯文本
corp <- tm_map(corp,removeNumbers) #清除数字符号
corp <- tm_map(corp, function(x){removeWords(x,stopwords())}) #过滤停止词库
term.matrix <- TermDocumentMatrix(corp)
#利用TermDocumentMatrix()函数将处理后的语料库进行断字处理,生成词频权重矩阵
term.matrix <- as.matrix(term.matrix) #频率
colnames(term.matrix) <- c("Paper1","paper2")
df<-data.frame(term.matrix)
write.csv(df,'term_matrix.csv') #导出两篇文章的频率分析结果
#---------------------------------------导入数据------------------------------------------
df<-read.csv('term_matrix.csv',header=TRUE,row.names=1)
#----------------------------------------两篇文章数据的对比-------------------------------------------------------------
comparison.cloud(df, max.words=300, random.order=FALSE, rot.per=.15, c(4,0.4), title.size=1.4)
comparison.cloud(df,max.words=300,random.order=FALSE,colors=c("#00B2FF", "red"))
commonality.cloud(df,max.words=100,random.order=FALSE,color="#E7298A")
# comparison cloud
comparison.cloud(df, random.order=FALSE,
colors = c("#00B2FF", "red", "#FF0099", "#6600CC"),
title.size=1.5, max.words=500)
#-------------------------------------单篇文章数据的展示-----------------------------------------------------------------
#Colors<-colorRampPalette(rev(brewer.pal(9,'RdBu')))(length(df$Paper1>10))
wordcloud(row.names(df) , df$Paper1 , min.freq=10,col=brewer.pal(8, "Dark2"), rot.per=0.3 )
分别是两篇文章的词云图,可以使用wordcloud包的wordcloud()函数绘制,而
_词云图.png)
_词云图.png)
是两篇文章独有的词汇文本展示,
是两篇文章共有的词汇文本展示,分别可以使用comparison.cloud()函数和commonality.cloud()函数绘制。kensington classificationresultforenames taby demographicbodycharactenistics paper2information iover技能多数据系列词云图R中的wordcloud包提供了绘制词云图的函数:wordcloud()、comparison.cloud()和commonalitycloud()。其中wordcloud(words,freq)函数绘制词云图,只需要提供文本(words)和对应的频率(frequency);comparison.cloud(term.matrix)和cpommonality.cloud(term.matrix)绘制对比词云图,term.matrix是一个行名,代表文本,每列数值代表文本对应的频数的矩阵。
单篇文章的词云图和
两篇文章的词云图的具体代码如下所示。#读入TXT文档1#读入TXT文档2tmpText<-data.frame(c(Paper1,Paper2).row.names=c(Text1"Text2"))df_title<-data.frame(doc_id=row.names(tmpText),text=tmpText$c.Paper1..Paper2.)ds<-DataframeSource(df_title)#创建一个数据框格式的数据源,首列是文档id(doc_id),第二列是文档内容#加载文档集中的文本并生成语料库文件corp=tm_map(corp.removePunctuation)#清除语料库内的标点符号corp=tm_map(corp,PlainTextDocument))#转换为纯文本corp=tm_map(corp,removeNumbers)#清除数字符号corp=tm_map(corp.function(x)[removeWordsx.stopwords()))#过滤停止词库term.matrix<-TermDocumentMatrix(corp)#利用TermDocumentMatrix()函数将处理后的语料库进行断字处理,生成词频权重矩阵term.matrix<-as.matrix(term.matrix)#频率comparison.cloud(term.matrix,max.words=300,random.order=FALSE,colors=c(#00B2FF"“red"))#
(a)commonality.cloud(term.matrix,max.words=100,random.order=FALSE.color="#E7298A")#