需求
数据有两列,我们需要绘制一个并排放置的柱状图。
image.pngSnipaste_2019-08-19_20-40-44
具体要求包括:
- 图的横坐标顺序要对
- 图的横坐标需要的化学物质是下角标
- 每组之间的的距离拉大一些
- 柱状图的从0开始
- 图例和xy轴标题去掉
- 图例放到最下面
- 图片的字体使用
Times New Roman
,同时把字体加粗 - 输出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")
网友评论