• 分面中添加直线


    简介

    这篇也是分享最近统计建模中所绘制的一副图形。总体而言和前面的几篇:xxx 类似。都是从“数据导入”到“基于分面的可视化”。但是本文的小技巧是,在不同的分面中添加直线。最后得到的图形如下:

    注意:本文数据和代码在公众号后台回复[建模比赛案例图形]即可免费获取。

    导入数据

    使用 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    数据处理

    使用 Tidyverse 包中的 pivot_longer() 将宽表转化为长表,具体教程可见:《R语言教程》。此时得到 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"))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意: 这里将模型该列转化为因子形式,并将因子水平进行设定。如果不设定,会按照首字拼写从小到大排序。本文想将“官方结果”放到第一位与其他方法比较,所以进行了这样的处理。

    数据可视化

    传统方法

    传统方法可以得到以下图形。但是小编想加入“官方结果”的横线,从而突出我们方法和该结果的比较。

    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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    各分面添加横线

    这里首先构建 dummy2 数据框。

    注意:列名称的构建, “叶类名称”名称需要和分面中的名称一致;“Z” 中赋值为“官方结果”(会按照这个数据画横线)。

    dummy2 <- data.frame(叶类名称 = dat3$ 叶类名称, Z = dat3$ 官方结果)
    
    • 1

    之后,在原始代码中加入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())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    全文代码

    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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    HTTP请求:requests的进阶使用方法浅析
    记一次 .NET 某工控视觉系统 卡死分析
    装饰者模式
    壳寡糖/肉桂醛修饰乳清蛋白,乳清浓缩蛋白-羟丙基甲基纤维素复合材料
    OPT-001
    那些年,我们写过的无效单元测试
    JS----前端不同格式的 UUID生成
    MySQL高可用搭建方案之(MHA)
    GUI编程--PyQt5--QWidget3 控件的交互
    用Nodejs 实现一个简单的 Redis客户端
  • 原文地址:https://blog.csdn.net/qq_37379316/article/details/128172486