分面中添加不同的直线

简介: 分面中添加不同的直线

简介

这篇也是分享最近统计建模中所绘制的一副图形。总体而言和前面的一篇: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]

Tidyverse: https://www.bing.com/search?q=tidyverse&cvid=5aab6bb79fc74a018e35597fb61195a1&aqs=edge..69i57j69i65l2.178j0j1&pglt=43&FORM=ANNTA1&PC=U531

[2]

《R语言教程》: https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/summary-manip.html#tidyr-longer


目录
相关文章
|
算法 测试技术 C++
C++算法:柱状图中最大的矩形
C++算法:柱状图中最大的矩形
|
7月前
|
Python
绘制直线
【5月更文挑战第11天】绘制直线。
35 1
|
Python
Voronoi多边形和Delaunay三角剖分
Voronoi多边形和Delaunay三角剖分
125 0
|
7月前
|
算法
[Halcon&拟合] 直线、矩形和圆的边缘提取
[Halcon&拟合] 直线、矩形和圆的边缘提取
443 0
|
数据挖掘
这图怎么画| 箱线图+散点+中位数连线
这图怎么画| 箱线图+散点+中位数连线
142 0
|
算法 计算机视觉 Python
霍夫变换绘制出图案里的直线
霍夫变换绘制出图案里的直线
R绘图 | 气泡散点图+拟合曲线
R绘图 | 气泡散点图+拟合曲线
313 0