# 本章重点内容是ggplot2的主题设置
# 可对数据之外的图形外观进行控制
# 8.1 介绍了主题系统,它控制着所有非数据展示功能
# 8.2 学习如何改变参数默认值,避免重复输入相同的参数
# 8.3 讨论如何将R中的图形转化LATEX 、Word以及其他展示或者文字处理软件中去
# 8.4 如何将多幅图形显示在单页面中
8.1 主题
# 主题系统控制着图形中的非数据元素外观
# 不会影响几何对象和标度等数据元素
# 主题的控制包括标题、坐标轴标签、图例标签等文字调整
# 以及网格线、背景、轴须的颜色搭配
# 与ggplot2其他部分类似,主题也可以修改许多参数
# 1,使用内置主题,图形每个元素的效果保持着视觉的一致性,详见8.1.1
# 2,修改内置主题的某些元素,详见8.2
# 一般来说,每种主题设置都可进行全局性的修改,使之应用到所有图形中
# 或者进行局部性的修改,使之应用到某幅图形中
8.1.1 内置主题
# 内置主题有两种
# 默认的 theme_gray() 淡灰色背景和白色网格线
# 另一个theme_bw() 白色背景和深灰色网格线
# 1,全局性设置:theme_set(theme_grey()) 或 theme_set(theme_bw()).theme_set()返回先前的主题
# 2,局部性设置:只改变单个图形的主题,qplot(...)+ theme_grey()
library(ggplot2movies)
hgram <- qplot(rating,data = movies,binwidth = 1)
hgram
# 主题在被创建时对图形无影响
# 在被绘制时才会影响图形
theme_set(theme_bw())
hgram
hgram + theme_grey()
# 可以通过向图形添加主题来覆盖单个图形中的初始主题
# 永久性储存初始主题
theme_set(theme_grey())
8.1.2 主题元素和元素函数
# 主题由控制图形外观的多个元素组成
# 有三个元素含有x和y的设置:axis.text,axis.title和strip.text
# 通过对水平和竖直方向元素的不同设置,可以控制不同方向的文本外观
# 这些控制元素外观的函数,称为元素函数
# 内置元素函数有四个基础类型:文本(text),线条(lines),矩形(rectangles),空白(blank)
# 每个元素函数都有一系列控制外观的参数
1,element_text() 绘制标签和标题
# 可控制字体的family,face,colour,size,hjust,vjust,angle,lineheight
hgramt <- hgram + labs(title = "This is a histogram")
hgramt
hgramt + theme(plot.title = element_text(size = 20,colour = "red"))
hgramt + theme(plot.title = element_text(size = 20,hjust = 0.5))
hgramt + theme(plot.title = element_text(size = 20,face = "bold"))
hgramt + theme(plot.title = element_text(size = 20,angle = 180))
2,element_line() 绘制线条或线段
# 可控制colour,size,linetype
hgramt + theme(panel.grid.major = element_line(colour = "red"))
hgramt + theme(panel.grid.major = element_line(size = 8))
hgramt + theme(panel.grid.major = element_line(linetype = "dotted"))
hgramt + theme(axis.line = element_line())
hgramt + theme(axis.line = element_line(colour = "red"))
hgramt + theme(axis.line = element_line(size = 1.0,linetype = "dashed"))
3,element_rect() 绘制主要供背景使用的矩阵
# 可控制 fill,colour,size,linetype
hgramt + theme(plot.background = element_rect(fill = "grey80",colour = NA))
hgramt + theme(plot.background = element_rect(size = 2))
hgramt + theme(plot.background = element_rect(colour = "red"))
hgramt + theme(panel.background = element_rect())
hgramt + theme(panel.background = element_rect(colour = "red"))
hgramt + theme(panel.background = element_rect(linetype = "dotted",colour = "red"))
4,element_blank() 表示空主题
# 即对元素不分配相应的绘图空间
# 可删去不感兴趣的绘图元素
hgramt
last_plot() + theme(panel.grid.minor = element_blank())
last_plot() + theme(panel.grid.major = element_blank())
last_plot() + theme(panel.background = element_blank())
last_plot() + theme(axis.title = element_blank(),axis.title.y = element_blank())
last_plot() + theme(axis.line = element_line())
# 使用theme_get() 可得到当前主题的设置
# theme() 可在一幅图中对某些元素进行局部性的修改
# theme_update() 可为后面图形的绘制进行全局性修改
old_theme <- theme_update(plot.background = element_rect(fill = "#3366FF"),
panel.background = element_rect(fill = "#003DF5"),
axis.text.x = element_text(colour = "#CCFF33"),
axis.text.y = element_text(colour = "#CCFF33",hjust = 1),
axis.title.x = element_text(colour = "#CCFF33",face = "bold"),
axis.title.y = element_text(colour = "#CCFF33",face = "bold",angle = 90)
)
qplot(cut,data = diamonds,geom = "bar")
qplot(cty,hwy,data = mpg)
theme_set(old_theme)
8.2 自定义标度和几何对象
8.2.1 标度
# 如果需要修改默认标度的显示方法
# 请重新定义或者使用ggplot2中已经定义的看可选方法覆盖
# 该函数的命名方法通常是 scale_xxx_continuous 或者 scale_xxx_discrete
p <- qplot(mpg,wt,data = mtcars,colour = factor(cyl))
p
# 修改默认颜色标度为 brewer
scale_colour_discrete <- scale_colour_brewer
p
8.2.2 几何对象和统计变换
# 类似 update_geom_defaults() 和 update_stat_defaults(),我们可以自定义几何对象和统计变换
# 与其他主题设置不同,此处设置只影响设置改变后新绘制的图形
# 例子展示了如何改变默认颜色和将默认直方图改变成密度直方图
update_geom_defaults("point",aes(colour = "darkblue"))
qplot(mpg,wt,data = mtcars)
update_stat_defaults("bin",aes(y = ..density..))
qplot(cyl,data = mpg,geom = "histogram",binwidth =1)
8.3 存储输出
# 基本图形输出有两种类型:矢量型和光栅型
# 矢量图可无限缩放而没有细节的损失
# 光栅图以像素阵列形式存储,具有固定的最优观测大小
# 可以使用ggsave()存储当前图形,参数如下:
# path设定图形存储路径
# width height 设置绝对尺寸大小,scale 设置图形相对屏幕展示的尺寸大小
# dpi参数控制图形的分辨率,默认300
qplot(mpg,wt,data = mtcars)
ggsave(file = "output.pdf")
getwd()
# 打开基于磁盘的图形设备(比如png() pdf())
pdf(file = "output.pdf",width = 6,height = 6)
# 关闭图形设备
dev.off()
8.4 一页多图
# 若想绘制一页多图,必须了解grid的工作原理
# 其关键概念是“视图窗口”(viewport)
# 默认的视图窗口占据了整个绘图区域,通过设置视图窗口,可以任意安排多幅图形的位置
# 首先,绘制三幅测试图形
# 最简单的方式是创建图形并将图形赋成变量,然后再绘制出来
# 这样只需关注图形的摆放而不是内容
# 以下是测试图形布局的三幅图
(a <- qplot(date,unemploy,data = economics,geom = "line"))
(b <- qplot(uempmed,unemploy,data = economics) + geom_smooth(se = F))
(c <- qplot(uempmed,unemploy,data = economics,geom = "path"))
8.4.1 子图
# 将子图嵌入到主图的顶部是常见的图形布局
# 首先绘制主图,然后在更小的视图窗口绘制子图
# viewport()函数可以创建视图窗口
# 参数x,y,width,height控制视图窗口的大小和位置
library(grid)
# 一个占据整个图形设备的视图窗口
vp1 <- viewport(width = 1,height = 1,x = 0.5,y = 0.5)
vp1 <- viewport()
# 只占了图形设备一半的宽和高的视图窗口
vp2 <- viewport(width = 0.5,height = 0.5,x = 0.5,y = 0.5)
vp2 <- viewport(width = 0.5,height = 0.5)
# 一个2cm x 3cm的视图窗口,定位在图形设备中心
vp3 <- viewport(width = unit(2,"cm"),height = unit(3,"cm"))
# x和y参数控制着视图窗口的中心位置
# 若想调整图形位置,需要通过just参数
# 在右上角的视图窗口
vp4 <- viewport(x = 1,y = 1,just = c("right","top"))
# 在左下角的视图窗口
vp5 <- viewport(x = 0,y = 0,just = c("left","bottom"))
# 还需使用print()中的vp参数
# 注意需要使用pdf()或png() 将图形存储到磁盘中,因为ggsave()只能存储一幅图
subvp <- viewport(width = 0.4,height = 0.4,x = 0.75,y = 0.35)
b
print(c,vp = subvp)
# 优化图形
csmall <- c + theme_gray(9) + labs(x = NULL,y = NULL) + theme(plot.margin = unit(rep(0,4),"lines"))
b
print(csmall,vp = subvp)
8.4.2 矩形网格
# grid.layout() ,设置一个任意高和宽的视图窗口网格
# 仍需一个个创建视图窗口
# 但不用设置视图窗口的位置和大小,只需设置布局的行数和列数即可
grid.newpage()
pushViewport(viewport(layout = grid.layout(2,2)))
vplayout <- function(x,y)
viewport(layout.pos.row = x,layout.pos.col = y)
# a图放到第1行,第1和第2列
# b图放到第2行,第1列
# c图放到第2行,第2列
print(a,vp = vplayout(1,1:2))
print(b,vp = vplayout(2,1))
print(c,vp = vplayout(2,2))
# 在默认的grid.layout()中,每个单元格的大小都相同,可以设置widths和heights参数
# 具体参考grid.layout()文档