(转帖)R语言-ggplot2笔记:主题设置、存储导出

原文地址:https://mp.weixin.qq.com/s/xg7cggq45tBI0EQUSxPKFw

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:城市和高速公路行驶记录每加仑行驶的英里数)

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

 geom_jitter() +

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

base

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

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

labelled <- base +

labs(

x = "City mileage/gallon",

y = "Highway mileage/gallon",

colour = "Cylinders",

title = "Highway and city mileage are highly correlated"

) +

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

labelled

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

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

styled <- labelled +

theme_bw() +

theme(

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

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

legend.justification = c(0, 1),

legend.position = c(0, 1),

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

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

panel.grid.minor = element_blank()

)

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(): 完全空白的主题

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

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

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

base + theme_grey() + ggtitle("theme_grey()")

base + theme_bw() + ggtitle("theme_bw()")

base + theme_linedraw() + ggtitle("theme_linedraw()")

base + theme_light() + ggtitle("theme_light()")

base + theme_dark() + ggtitle("theme_dark()")

base + theme_minimal() + ggtitle("theme_minimal()")

base + theme_classic() + ggtitle("theme_classic()")

base + theme_void() + ggtitle("theme_void()")

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

8.3 Modifying Theme Components

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

基本语法如:

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

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

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

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

 geom_jitter() +

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

element_blank():清空画板

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

 geom_jitter() +

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

base

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

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

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

8.4 控制主题的各种元素

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

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

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

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

df <- data.frame(

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

 y = 1:3

)

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

base

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

base +

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

 xlab(NULL) +

 ylab(NULL)

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

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

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

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

# Wide screen

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

# Long and skiny

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

# Square

base2 + theme(aspect.ratio = 1)

8.5 储存和导出(Saving Your Output)

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

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

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

ggplot2有两种保存方法:

第一种:

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

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

dev.off()

第二种使用ggsave:

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

ggsave("output.pdf")

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容

  • 简介 文章较长,点击直达我的博客,浏览效果更好。本文内容基本是来源于STHDA,这是一份十分详细的ggplot2使...
    taoyan阅读 50,624评论 7 159
  • 变量 自定义变量 PHP变量用$加变量名来表示,注意变量名区分大小写,这意味着,如下两个变量是不一样的。 有效的变...
    波哥教你学阅读 1,777评论 0 2
  • “今天真是倒霉的一天”——一年前的思维方式, 早起就看到给如意洗的衣服,老公居然没晾。今天要带的。 1、最近如意吃...
    如意妈花小美阅读 419评论 2 1
  • 亲爱的轩轩: 今天睡前爸爸给你讲故事,所以妈妈没有给你读昨天写的情书,明天补了一起吧! 早上是个下雨天,妈妈催促你...
    在写日志的眼袋妹阅读 287评论 0 1
  • 在近一年的青椒计划学习里,匆匆而过的学习留给了我满满的收获和深深的思考。这次学习,我聆听专家的讲课,观摩优秀教师的...
    陕县1643王晓丽阅读 668评论 0 0