简介
这篇也是分享最近统计建模中所绘制的一副图形。总体而言和前面的一篇:R绘图案例|基于分面的折线图绘制 类似。都是从“数据导入”到“基于分面的可视化”。但是本文的小技巧是,在不同的分面中添加直线。最后得到的图形如下:
注意:本文数据和代码在公众号后台回复[
建模比赛案例图形
]即可免费获取。
导入数据
使用 readxl 包中的 read_excel()
加载 sheet=3
的数据集。预览如下:
# install.packages("readxl") library(readxl) library(ggplot2) library(tidyverse) library(viridis) library(showtext) showtext_auto() dat3 = read_excel("test.xlsx",sheet=3,na="NA") head(dat3)
数据处理
使用 Tidyverse[1] 包中的 pivot_longer()
将宽表转化为长表,具体教程可见:《R语言教程》[2]。此时得到 ggplot2 所需的数据类型。
dat3 %>% pivot_longer( cols = `官方结果`:`XGBoost`, names_to = "模型", names_transform = list(模型 = as.character), values_to = "value") -> dat_3_new dat_3_new$ 模型 = factor(dat_3_new$ 模型, levels = c("官方结果","朴素贝叶斯","支持向量机", "决策树","随机森林","XGBoost"))
注意:这里将模型该列转化为因子形式,并将因子水平进行设定。如果不设定,会按照首字拼写从小到大排序。本文想将“官方结果”放到第一位与其他方法比较,所以进行了这样的处理。
数据可视化
传统方法
传统方法可以得到以下图形。但是小编想加入“官方结果”的横线,从而突出我们方法和该结果的比较。
dat_3_new %>% ggplot(aes(`模型`,value,fill = `模型`)) + geom_col() + facet_wrap(vars(`叶类名称`)) + theme_bw() + ylab("准确度") + xlab("") + #主题设置 scale_fill_viridis(discrete = T,option = "D") + theme(panel.grid = element_blank(), legend.position = 'bottom', legend.direction = "horizontal", axis.text.x = element_blank(), axis.ticks.x = element_blank())
各分面添加横线
这里首先构建 dummy2
数据框。
注意:列名称的构建, “
叶类名称
”名称需要和分面中的名称一致;“Z
” 中赋值为“官方结果”(会按照这个数据画横线)。
dummy2 <- data.frame(叶类名称 = dat3$ 叶类名称, Z = dat3$ 官方结果)
之后,在原始代码中加入geom_hline(data = dummy2,aes(yintercept = Z))
即可。
dummy2 <- data.frame(叶类名称 = dat3$ 叶类名称, Z = dat3$ 官方结果) dat_3_new %>% ggplot(aes(`模型`,value,fill = `模型`)) + geom_col() + facet_wrap(vars(`叶类名称`)) + geom_hline(data = dummy2,aes(yintercept = Z)) + # scale_fill_manual(values = cols[1:6]) + theme_bw() + ylab("准确度") + xlab("") + #主题设置 scale_fill_viridis(discrete = T,option = "D") + theme(panel.grid = element_blank(), legend.position = 'bottom', legend.direction = "horizontal", axis.text.x = element_blank(), axis.ticks.x = element_blank())
全文代码
dat3 = read_excel("test.xlsx",sheet=3,na="NA") head(dat3) dat3 %>% pivot_longer( cols = `官方结果`:`XGBoost`, names_to = "模型", names_transform = list(模型 = as.character), values_to = "value") -> dat_3_new dat_3_new$ 模型 = fct_relevel(dat_3_new$ 模型, "官方结果","朴素贝叶斯","支持向量机","决策树","随机森林","XGBoost") head(dat_3_new) dummy2 <- data.frame(叶类名称 = dat3$ 叶类名称, Z = dat3$ 官方结果) dat_3_new %>% ggplot(aes(`模型`,value,fill = `模型`)) + geom_col() + facet_wrap(vars(`叶类名称`)) + geom_hline(data = dummy2,aes(yintercept = Z)) + # scale_fill_manual(values = cols[1:6]) + theme_bw() + ylab("准确度") + xlab("") + #主题设置 scale_fill_viridis(discrete = T,option = "D") + theme(panel.grid = element_blank(), legend.position = 'bottom', legend.direction = "horizontal", axis.text.x = element_blank(), axis.ticks.x = element_blank())
参考资料
[1]
[2]
《R语言教程》: https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/summary-manip.html#tidyr-longer