查看原文
其他

ggplot2笔记8:主题设置、存储导出

圈圈 宏基因组 2022-03-28

ggplot2绘图基础系列:


Themes

8.1 Introduction

第八章讲的是ggplot2的主题设置,通过它你可以对数据之外的图形外观进行控制。第一版的中文版的把这一章的章节名翻译为“精雕细琢”。

控制主题设置主要有以下四个方面:

  • 主题元素,指的是非数据元素, plot.title控制标题的外观, axis.ticks.x控制x轴的刻度, legend.key.height控制图例中按键的高度。

  • 元素函数,描述元素的视觉属性,例如 element text()可以设置字体大小、颜色和文本外观如 plot.title

  • theme()函数,用来覆盖默认的主题元素,如 theme(plot.title=element text(colour="red"))

  • 完整主题,如 theme_grey(),用来把所有主题元素协调一致。

举例,如下图表,

(变量cty和hwy:城市和高速公路行驶记录每加仑行驶的英里数)

  1. base <- ggplot(mpg, aes(cty, hwy, color = factor(cyl))) +

  2.  geom_jitter() +

  3.  geom_abline(colour = "grey50", size = 2)

  4. base

在这个图的基础上,我们想改进轴和图例的标签;添加标题;调整颜色等,

通过第六章标度相关的知识我们可以添加标签、修改标度:

  1. labelled <- base +

  2. labs(

  3. x = "City mileage/gallon",

  4. y = "Highway mileage/gallon",

  5. colour = "Cylinders",

  6. title = "Highway and city mileage are highly correlated"

  7. ) +

  8. scale_colour_brewer(type = "seq", palette = "Spectral")

  9. labelled

下一步,如果你想改变整个风格,修改标度就不能满足了,就要用的这一章的内容

如修改背景颜色、图例位置、移除次要网格线、改变字体大小

  1. styled <- labelled +

  2. theme_bw() +

  3. theme(

  4. plot.title = element_text(face = "bold", size = 12),

  5. legend.background = element_rect(fill = "white", size = 4, colour = "white"),

  6. legend.justification = c(0, 1),

  7. legend.position = c(0, 1),

  8. axis.ticks = element_line(colour = "grey70", size = 0.2),

  9. panel.grid.major = element_line(colour = "grey70", size = 0.2),

  10. panel.grid.minor = element_blank()

  11. )

  12. styled

8.2 Complete Themes

ggplot2有多个内置主题。其中默认主题是 theme_grey(),淡灰色背景和白色网格线。除此之外还有很多其他主题

  • theme_bw(): 是 theme_grey()的变体,白色背景和灰色网格线

  • theme_linedraw(): 白色背景黑色线条

  • theme_light(): 和 theme_linedraw()很像,区别是线条为灰色

  • theme_dark():黑色背景的 theme_light(),可以用来画薄彩色线条

  • theme_minimal():简约主题

  • theme_classic(): 只有x、y轴没有背景和网格线

  • theme_void(): 完全空白的主题

创建一个简单的数据集作为例子,分别设置成以上七个主题:

  1. df <- data.frame(x = 1:3, y = 1:3)

  2. base <- ggplot(df, aes(x, y)) + geom_point()

  3. base + theme_grey() + ggtitle("theme_grey()")

  4. base + theme_bw() + ggtitle("theme_bw()")

  5. base + theme_linedraw() + ggtitle("theme_linedraw()")

  6. base + theme_light() + ggtitle("theme_light()")

  7. base + theme_dark() + ggtitle("theme_dark()")

  8. base + theme_minimal() + ggtitle("theme_minimal()")

  9. base + theme_classic() + ggtitle("theme_classic()")

  10. base + theme_void() + ggtitle("theme_void()")

除此之外,有一个专门的主题R包叫 ggthemes(Jeffrey Arnold),里面有更多的选择。

8.3 Modifying Theme Components

这一节讲的是如何修改主题中的个别部分,使用相关的元素函数。

基本语法如:

  1. plot + theme(element.name = element function())

元素函数有四种基本类型:字体(text)、线条(line)、矩形(rectangles)和空白(blank)。

  • element_text():修改图标题的位置和字体,包括 family、 face、 colour、 size、 hjust、 vjust、 angle、 lineheight这些参数

  1. base <- ggplot(mpg, aes(cty, hwy, color = factor(cyl))) +

  2.  geom_jitter() +

  3.  geom_abline(colour = "grey50", size = 2)

  4. base_t <- base + labs(title = "This is a ggplot") + xlab(NULL) + ylab(NULL)

  5. base_t + theme(plot.title = element_text(size = 16))

  6. base_t + theme(plot.title = element_text(face = "bold", colour = "red"))

  7. base_t + theme(plot.title = element_text(hjust = 1))

另外, margin()参数可以设置标题和图表之间的距离,默认值是0,左右上下均可设置:

  1. # The margins here look asymmetric because there are also plot margins

  2. base_t + theme(plot.title = element_text(margin = margin()))

  3. base_t + theme(plot.title = element_text(margin = margin(t = 10, b = 10)))

  4. base_t + theme(axis.title.y = element_text(margin = margin(r = 10)))

  • element_line:修改网格线,颜色、粗细、虚实等,如 colour, size以及 linetype

  1. base + theme(panel.grid.major = element_line(colour = "black"))

  2. base + theme(panel.grid.major = element_line(size = 2))

  3. base + theme(panel.grid.major = element_line(linetype = "dotted"))

  • element_rect:添加矩形图层,如 fill(修改背景颜色), colour, size以及 linetype

  1. base + theme(plot.background = element_rect(fill = "grey80", colour = NA))

  2. base + theme(plot.background = element_rect(colour = "red", size = 2))

  3. base + theme(panel.background = element_rect(fill = "linen"))

  • element_blank():清空画板

  1. base <- ggplot(mpg, aes(cty, hwy, color = factor(cyl))) +

  2.  geom_jitter() +

  3.  geom_abline(colour = "grey50", size = 2)

  4. base

  5. last_plot() + theme(panel.grid.minor = element_blank())

  6. last_plot() + theme(panel.grid.major = element_blank())

还有一些相关的细枝末节的设置,小白觉得这些设置相当繁琐,很容易就占用了大量的作图时间,也不是重点,所以在此就先跳过啦。

8.4 控制主题的各种元素

大概有40多个属性可以控制主题。大致分为 plot, axis, legend, panelfacet这几大类。

下表总结了一下控制主题的主要元素:

下面从中选几个比较重要的来举几个例子

  • 当横轴刻度线标签名字过长,我们可以调整标签的角度和位置:

  1. df <- data.frame(

  2.  x = c("label", "a long label", "an even longer label"),

  3.  y = 1:3

  4. )

  5. base <- ggplot(df, aes(x, y)) + geom_point()

  6. base

  7. ## 调整角度-30°,中心垂直距离下移1

  8. base +

  9.  theme(axis.text.x = element_text(angle = -30, vjust = 1, hjust = 0)) +

  10.  xlab(NULL) +

  11.  ylab(NULL)

  • 假如你需要调整图形的长宽比:

  1. df2 <- data.frame(x = 1:4, y = 1:4, z = rep(c("a", "b"), each = 2))

  2. base <- ggplot(df2, aes(x, y, colour = z)) + geom_point()

  3. base2 <- base + theme(plot.background = element_rect(colour = "grey50"))

  4. # Wide screen

  5. base2 + theme(aspect.ratio = 9 / 16)

  6. # Long and skiny

  7. base2 + theme(aspect.ratio = 2 / 1)

  8. # Square

  9. base2 + theme(aspect.ratio = 1)

8.5 储存和导出(Saving Your Output)

当保存图片时,你有两种基本选择:矢量型图片和栅格型图片

  • 矢量型:图形可以无限缩放没有细节的损失;但如果包含数千个对象,矢量渲染过程会很慢

  • 栅格形:以像素阵列形式存储,有固定的最优观测大小,对于图形印刷,分辨率(600dpi)是较好的方案。

ggplot2有两种保存方法:

第一种:

  1. pdf("output.pdf", width = 6, height = 6)

  2. ggplot(mpg, aes(displ, cty)) + geom_point()

  3. dev.off()

第二种使用 ggsave

  1. ggplot(mpg, aes(displ, cty)) + geom_point()

  2. ggsave("output.pdf")

显然第二种方法更加方便简洁,不过我们需要设置以下参数:

  • path设定图形储存路径。 ggsave() 可以生成以下格式: .eps.pdf.svg.wmf,.png.jpg.bmp, and .tiff.

  • width和 height设置绝对尺寸的大小,可以精确控制尺寸

  • 分辨率 dpi默认值300,你可以修改为600。


参考资料:

  1. Hadley Wickham(2016). ggplot2. Springer International Publishing. doi: 10.1007/978-3-319-24277-4

  2. 《R语言应用系列丛书·ggplot2:数据分析与图形艺术》

-------------------我是求关注的分界线--------------

更多R语言、可视化作图ggplot2包学习笔记请关注微信公众号:

猜你喜欢

10000+:肠道细菌 人体上的生命 宝宝与猫狗 梅毒狂想曲 提DNA发Nature 实验分析谁对结果影响大  Cell微生物专刊

系列教程:微生物组入门 Biostar 微生物组  宏基因组

专业技能:生信宝典 学术图表 高分文章 不可或缺的人

一文读懂:宏基因组 寄生虫益处 进化树

必备技能:提问 搜索  Endnote

文献阅读 热心肠 SemanticScholar Geenmedical

扩增子分析:图表解读 分析流程 统计绘图

16S功能预测   PICRUSt  FAPROTAX  Bugbase Tax4Fun

在线工具:16S预测培养基 生信绘图

科研经验:云笔记  云协作 公众号

编程模板 Shell  R Perl

生物科普  生命大跃进  细胞暗战 人体奥秘  

写在后面

为鼓励读者交流、快速解决科研困难,我们建立了“宏基因组”专业讨论群,目前己有国内外150+ PI,1500+ 一线科研人员加入。参与讨论,获得专业解答,欢迎分享此文至朋友圈,并扫码加主编好友带你入群,务必备注“姓名-单位-研究方向-职称/年级”。技术问题寻求帮助,首先阅读《如何优雅的提问》学习解决问题思路,仍末解决群内讨论,问题不私聊,帮助同行。

学习16S扩增子、宏基因组科研思路和分析实战,关注“宏基因组”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存