ggplot2:数据分析与图形艺术 学习笔记08---第八章 精雕细琢

浏览: 4274

# 本章重点内容是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())

Clipboard Image.pngClipboard Image.png


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))

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

Clipboard Image.png


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"))

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png


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"))

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

 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())

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png


# 使用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)

Clipboard Image.pngClipboard Image.png


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

Clipboard Image.pngClipboard Image.png

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)

Clipboard Image.pngClipboard Image.png

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"))

Clipboard Image.pngClipboard Image.png

Clipboard Image.png


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)

Clipboard Image.pngClipboard Image.png

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))

Clipboard Image.pngClipboard Image.png

Clipboard Image.png

# 在默认的grid.layout()中,每个单元格的大小都相同,可以设置widths和heights参数

# 具体参考grid.layout()文档

推荐 0
本文由 Parlan怕冷 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册