美文网首页ggplot2绘图
[ggplot2|project] 柱状图绘制及细节调整

[ggplot2|project] 柱状图绘制及细节调整

作者: drlee_fc74 | 来源:发表于2019-08-19 22:54 被阅读6次

    需求

    数据有两列,我们需要绘制一个并排放置的柱状图。

    image.png

    Snipaste_2019-08-19_20-40-44

    具体要求包括:

    1. 图的横坐标顺序要对
    2. 图的横坐标需要的化学物质是下角标
    3. 每组之间的的距离拉大一些
    4. 柱状图的从0开始
    5. 图例和xy轴标题去掉
    6. 图例放到最下面
    7. 图片的字体使用Times New Roman,同时把字体加粗
    8. 输出pdf文件 # 具体实现

    生成数据

    在形成数据框的时候,R会自动的检查列名是不是符合普通的规则,如果有空格或者特殊符号等都会进行强制转换。我们可以通过check.names = F来去掉自动检查。

    PS:这个功能同时也可以用于read.table等读取数据的时候。

    dat <- data.frame(abc = c("Co-MnO2", "Cu-MnO2", "MnO2", "Ce-MnO2"),
                      `Dry Gas` = c(99.5, 97.9, 87.2, 75.7),
                      `35% RH` = c(72.9, 56.7, 60.3, 46.7), check.names = F)
    dat
    
    ##       abc Dry Gas 35% RH
    ## 1 Co-MnO2    99.5   72.9
    ## 2 Cu-MnO2    97.9   56.7
    ## 3    MnO2    87.2   60.3
    ## 4 Ce-MnO2    75.7   46.7
    

    数据转换

    ggplot2对于数据的做图,是用于长数据的做图。我们需要对数据进行一定的转换。

    library(tidyverse)
    
    ## ── Attaching packages ───────────────────────────────────── tidyverse 1.2.1 ──
    
    ## ✔ ggplot2 3.2.1     ✔ purrr   0.3.2
    ## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
    ## ✔ tidyr   0.8.3     ✔ stringr 1.4.0
    ## ✔ readr   1.3.1     ✔ forcats 0.4.0
    
    ## ── Conflicts ──────────────────────────────────────── tidyverse_conflicts() ──
    ## ✖ dplyr::filter() masks stats::filter()
    ## ✖ dplyr::lag()    masks stats::lag()
    
    dat1 <- gather(data = dat, key = "key", value = "value", -abc)
    dat1
    
    ##       abc     key value
    ## 1 Co-MnO2 Dry Gas  99.5
    ## 2 Cu-MnO2 Dry Gas  97.9
    ## 3    MnO2 Dry Gas  87.2
    ## 4 Ce-MnO2 Dry Gas  75.7
    ## 5 Co-MnO2  35% RH  72.9
    ## 6 Cu-MnO2  35% RH  56.7
    ## 7    MnO2  35% RH  60.3
    ## 8 Ce-MnO2  35% RH  46.7
    

    做图

    我们使用geom_bar来进行做图,同时使用fill来对文章进行数据填充分组

    ggplot(dat1, aes(abc, value, fill = key)) + geom_bar(stat = "identity", position = "dodge")
    
    image.png

    细节调整

    拉大各组之间的距离

    不同组之间的距离我们可以通过position_dodge以及width来进行调整。

    ggplot(dat1, aes(abc, value, fill = key)) + geom_bar(stat = "identity", position = position_dodge(0.5), width = 0.5)
    
    image.png

    调整顺序

    这个图和上面那个图的顺序区别在于:横坐标的顺序不对以及每组的两个柱状图的顺序不对。这个是因为在绘制离散型的数据的时候,ggplot2按照按照字母顺序来排序,如果有数字也是按照数字在字母前来排序。因为我们需要修改两个参数的因子水平

    dat1$abc <- factor(dat1$abc, levels = c("Co-MnO2", "Cu-MnO2", "MnO2", "Ce-MnO2"))
    dat1$key <- factor(dat1$key, levels = c("Dry Gas", "35% RH"))
    p <- ggplot(dat1, aes(abc, value, fill = key)) + geom_bar(stat = "identity", position = position_dodge(0.5), width = 0.5);p
    
    image.png

    增加下角标

    我们可以通过expression函数来增加下角标或者上角标。其中[]来增加下角标;^增加上角标

    p1 <- p + scale_x_discrete(labels =c(expression(`Co-MnO`[2]),expression(`Cu-MnO`[2]), expression(MnO[2]), expression(`Ce-MnO`[2]))); p1
    
    image.png

    y轴直接和x轴相连

    默认的图片当中,y轴的其实位置和x轴是有一定距离的,我们可以通过expand参数来调整使其相连

    p2 <- p1 + scale_y_continuous(expand = c(0,0));p2
    
    image.png

    去掉标题

    • 对于坐标轴的标题我们可以通过labs函数来统一的调整。同时也可以通过xlab/ylab来分别调整。另外也可以通过scale_x/y_*当中的name参数进行调整。
    • 对于图例的标题,我们可以通过guides参数当中对具体的图例进行调整。
    p3 <-  p2 + labs(x = NULL, y = NULL) + guides(fill = guide_legend(title = NULL));p3
    
    image.png

    图例位置调整

    我们可以通过theme当中的legend.postion来调整图例的位置。默认的我们调整到下面和上面的时候图例是横向的。如果还是想要竖着的可以通过legend.direction来进行调整

    p4 <- p3 + theme(legend.position = "bottom", legend.direction = "vertical"); p4
    
    image.png

    字体调整

    我们可以通过theme当中的text对所有的字体进行调整。也可以通过制定具体位置来调整。例如通过axix.title.x对x轴的标题进行调整。在这个参数当中的element_text来设定对字体的调整。主要是通过family来调整字体; size调整大小,color调整颜色; face调整字体格式(是否加粗等)。face接受(“plain”, “italic”, “bold”, “bold.italic”)四种形式。

    PS: 需要注意的是,如果用expression加了下角标之后,好像没办法加粗

    p4 + theme(text = element_text(family = "Times New Roman", face = "bold"))
    
    image.png

    保存为pdf文件

    我们在使用ggsave保存文件的时候,如果是指定新的字体,保存成pdf文件的时候会出错。这个好像是和R当中没有相对应的字体有关。 这个时候我们可以使用showtext包来加载字体。 我们需要通过这个包的font_paths来查看字体存放的位置;通过font_files查看有有哪些字体;通过font_add添加指定字体。通过showtext_auto来使用字体。

    ## Loading required package: sysfonts
    
    ## Loading required package: showtextdb
    
    ## [1] "/Library/Fonts"             "/Users/lihao/Library/Fonts"
    
    ##             path                   file              family     face
    ## 1 /Library/Fonts            Al Nile.ttc             Al Nile  Regular
    ## 2 /Library/Fonts          Al Tarikh.ttc           Al Tarikh  Regular
    ## 3 /Library/Fonts            AlBayan.ttc            Al Bayan    Plain
    ## 4 /Library/Fonts AmericanTypewriter.ttc American Typewriter  Regular
    ## 5 /Library/Fonts        Andale Mono.ttf         Andale Mono  Regular
    ## 6 /Library/Fonts     Apple Chancery.ttf      Apple Chancery Chancery
    ##         version            ps_name
    ## 1      13.0d2e2             AlNile
    ## 2      13.0d2e1           AlTarikh
    ## 3      13.0d1e6            AlBayan
    ## 4      13.0d1e4 AmericanTypewriter
    ## 5 Version 2.00x         AndaleMono
    ## 6      13.0d1e4     Apple-Chancery
    
    p4 + theme(text = element_text(family = "Time", face = "bold"))
    ggsave("file.pdf")
    

    相关文章

      网友评论

        本文标题:[ggplot2|project] 柱状图绘制及细节调整

        本文链接:https://www.haomeiwen.com/subject/eweysctx.html