ggplot2绘图

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

2019-08-19  本文已影响6人  drlee_fc74

需求

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

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

去掉标题

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")
上一篇 下一篇

猜你喜欢

热点阅读