• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

数据可视化——R语言使用ggplot2工具包绘制组别间指标差异对比图(箱形图及误差条图) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

数据可视化——R语言ggplot2包绘制组别间指标差异对比图(箱形图及误差条图)

使用工具:R语言中的ggplot2工具包, RcolorBrewer颜色工具包

有时,我们需要对多个模型之间的性能评估的重复测量指标进行比较,如何对比显示呢?以下提供了两种方案:(1)箱形图;(2)差异对比图。

箱形图能方便显示数字数据组的四分位数,在数据表达中很常见。此处的差异对比图是指不同模型两两之间对应的属性指标相减后对差异值进行显示,显示方式为误差条图,此处的误差条上界为模型间差异值的上四分位数,中间的点为差异值的中值,下界为差异值的下四分位数。

示例中的数据为模拟生成的。共5个模型,每个模型都有一个属性指标,且每个模型的每个属性指标都进行了100次重复测量。如果要将你的数据进行显示,可做相应的修改。

箱形图直接对5个模型的100次测量值进行显示(不需要额外的计算)。绘制差异对比图时需要额外的计算,即每两两模型之间指标属性相减求出差异,然后寻找差异值的上、下四分位数和中值即可。

示例代码如下:

rm(list = ls()) #清除工作区

library(ggplot2)
library(RColorBrewer)

#生成模拟数据
#假设有5个模型,每个模型一个重复100次测量的属性(如一个模型100次交叉验证的准确率)
model1.attribute <- runif(100)+3 #模型1属性的100次重复测量
model2.attribute <- runif(100)+2 #模型2属性的100次重复测量
model3.attribute <- runif(100)+1 #模型3属性的100次重复测量
model4.attribute <- runif(100)+0.5 #模型4属性的100次重复测量
model5.attribute <- runif(100) #模型5属性的100次重复测量

group <- c(rep("Model1",100),rep("Model2",100),rep("Model3",100),rep("Model4",100),rep("Model5",100)) #生成数据对应的模型分组
group <- factor(group) #转为因子变量
value <- c(model1.attribute ,model2.attribute,model3.attribute,model4.attribute,model5.attribute) #每个模型属性的100次重复测量
Data1 <- data.frame(group=group,value=value) #生成的模拟数据

###################################################

#使用R语言自带的boxplot函数绘制箱线图
jpeg(file = "results_Value_1.jpg",width =1800,height = 1600,units = "px",res =300) #结果保存保存为results_Value_1.jpg,宽高为1800*1600像素,分辨率为300dpi
par(cex.main=1.2,cex.lab=1.1) #"cex.main="设置标题的缩放倍数,"cex.lab="设置坐标轴标签(名称)的缩放倍数
boxplot(value~group,data = Data1,notch=TRUE, #添加notch=TRUE,可以得到含凹槽的箱线图
        col= brewer.pal(8,"Pastel2")[1:5],main="Comparison of assessment indicators",ylab="Value") #设置填充颜色和标题
dev.off()

###################################################

#使用ggplot2包生成箱线图
P1 <- ggplot(Data1,aes(x=group,y=value,fill=group))+ #”fill=“设置填充颜色
  geom_boxplot(notch=TRUE,size=0.5)+#添加notch=TRUE,可以得到含凹槽的箱线图,”size=“设置箱线图的边框线和胡须的线宽度
  theme_bw()+ #背景设为白色
  scale_fill_manual(values = brewer.pal(8,"Pastel2")[1:5])+ #设置填充的颜色
  ggtitle("Comparison of assessment indicators")+ #设置总的标题
  theme(legend.position="none", #不需要图例
        axis.text.x=element_text(angle=15,hjust = 1,colour="black",family="Times",size=16), #设置x轴刻度标签的字体显示倾斜角度为15度,并向下调整1(hjust = 1),字体簇为Times大小为16
        axis.text.y=element_text(family="Times",size=14,face="plain"), #设置x轴刻度标签的字体属性
        axis.title.y=element_text(family="Times",size = 16,face="plain"), #设置y轴的标题的字体属性
        plot.title = element_text(family="Times",size=16,face="bold",hjust = 0.5))+#设置总的标题的字体属性
  ylab("Value")+xlab("") #设置x轴和y轴的标题
  
P1

jpeg(file = "results_Value_2.jpg",width =1800,height = 1600,units = "px",res =300) #结果保存
print(P1)
dev.off()

###################################################

#计算各个模型属性之间的差值
model1_model2 <- model1.attribute - model2.attribute
model1_model3 <- model1.attribute - model3.attribute
model1_model4 <- model1.attribute - model4.attribute
model1_model5 <- model1.attribute - model5.attribute
model2_model3 <- model2.attribute - model3.attribute
model2_model4 <- model2.attribute - model4.attribute
model2_model5 <- model2.attribute - model5.attribute
model3_model4 <- model3.attribute - model4.attribute
model3_model5 <- model3.attribute - model5.attribute
model4_model5 <- model4.attribute - model5.attribute

#生成数据框
da<- data.frame(model1_model2,model1_model3,model1_model4,model1_model5,
                   model2_model3,model2_model4,model2_model5,
                   model3_model4,model3_model5,
                   model4_model5)
names(da) <- c("Model1 vs. Model2","Model1 vs. Model3","Model1 vs. Model4","Model1 vs. Model5",
              "Model2 vs. Model3","Model2 vs. Model4","Model2 vs. Model5",
              "Model3 vs. Model4","Model3 vs. Model5",
              "Model4 vs. Model5")

#计算每两两模型之间差值的25%分位数,中位数,75%分位数
da_quantile <- apply(da,2,function(x)quantile(x,c(0.25,0.5,0.75)))
Data <- data.frame(names(da),da_quantile[1,],da_quantile[2,],da_quantile[3,])
names(Data) <- c("group_diff","down_diff","median_diff","up_diff")

###################################################

#绘制模型之间的属性值的差异对比图
P2 <- ggplot(Data,aes(x=group_diff,y=median_diff)) + 
  geom_errorbar(aes(x=group_diff, ymin=down_diff , ymax=up_diff), width=0.3, colour="black", alpha=1, size=1.3)+ #使用绘制误差条图的方法绘制模型间差值的25%分位数,中位数,75%分位数
  geom_point(size = 4)+  #设置点的大小(对应模型间差值的中位数)
  theme(axis.ticks.y = element_blank())+  #去除y轴的刻度线
  geom_vline(xintercept = 0.4,group=1)+geom_hline(yintercept = 0,linetype=2,size=0.8)+ #绘制x=0和y=0直线
  theme(
    panel.background = element_rect(fill = "transparent",colour = NA), #背景色置为白色
    axis.text.x=element_text(size=12,face="bold"), #设置x轴的刻度字体大小
    axis.title.x=element_text(size=12,face="bold"), #设置x轴的标题字体大小
    axis.text.y=element_text(size=12,face="bold"))+ #设置Y轴的刻度字体大小
  coord_flip()+ #坐标轴旋转
  xlab("")+ylab("Differences in assessment indicators between relevant pairs")   #设置x轴,y轴的标签
P2
jpeg(file = "results_Value_3.jpg",width =2000,height = 1500,units = "px",res =300) #结果保存
print(P2)
dev.off()

效果图如下:

图一 使用R语言自带的boxplot()函数绘制的效果

图二 使用ggplot2包绘制的效果


图三 不同模型间属性评估指标的差异对比图。其中,实心点表示相应模型之间的属性差值值的中位数,左边胡须表示下四分位数,右边胡须表示上四分位数。

RcolorBrewer包在我之前的博客有介绍,请参考:数据可视化——R语言使用ggplot2工具包绘制精美的条形图(https://blog.csdn.net/zhouhucheng00/article/details/85801297)

由于使用ggpolt2包绘制的箱线图的胡须末端没有短横线,因此我也尝试了使用R语言自带的boxplot()函数绘制箱线图,效果图如图1所示。如果你知道如何使用ggplot2包绘制箱形图为胡须末端添加短横线,欢迎评论!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap