ggplot2学习笔记系列之主题(theme)设置

taoyan

上次提了下theme(),本文将专门讲解一下。凡是与数据无关的图形设置可以归为主题类,ggplot2中主题设置十分多,根本不可能讲解完,只能稍微讲点皮毛,灵活运用才是关键,本文只是总体上略作介绍。正如R语言大神Hadley Wickham所讲的,ggplot2只是提供了一个平台,可以根据自己的需要无限创造。理论上来讲,只要能想到的图形,ggplot2都能实现。

library(ggplot2)
#我们先来看看ggplot2默认的主题设置函数theme_gray()的源代码
theme_gray#函数名不加括号可获得函数源代码

## function (base_size = 11, base_family = "") 
## {
## half_line <- base_size/2
## theme(line = element_line(colour = "black", size = 0.5, linetype = 1, 
## lineend = "butt"), rect = element_rect(fill = "white", 
## colour = "black", size = 0.5, linetype = 1), text = element_text(family = base_family, 
## face = "plain", colour = "black", size = base_size, lineheight = 0.9, 
## hjust = 0.5, vjust = 0.5, angle = 0, margin = margin(), 
## debug = FALSE), axis.line = element_blank(), axis.line.x = NULL, 
## axis.line.y = NULL, axis.text = element_text(size = rel(0.8),
## colour = "grey30"), axis.text.x = element_text(margin = margin(t = 0.8 * 
## half_line/2), vjust = 1), axis.text.x.top = element_text(margin = margin(b = 0.8 * ## half_line/2), vjust = 0), axis.text.y = element_text(margin = margin(r = 0.8 * 
## half_line/2), hjust = 1), axis.text.y.right = element_text(margin = margin(l = 0.8 * ## half_line/2), hjust = 0), axis.ticks = element_line(colour = "grey20"), 
## axis.ticks.length = unit(half_line/2, "pt"), axis.title.x = element_text(margin = margin(t = half_line), 
## vjust = 1), axis.title.x.top = element_text(margin = margin(b = half_line), 
## vjust = 0), axis.title.y = element_text(angle = 90, 
## margin = margin(r = half_line), vjust = 1), axis.title.y.right = element_text(angle = -90, 
## margin = margin(l = half_line), vjust = 0), legend.background = element_rect(colour = NA), 
## legend.spacing = unit(0.4, "cm"), legend.spacing.x = NULL, 
## legend.spacing.y = NULL, legend.margin = margin(0.2, 
## 0.2, 0.2, 0.2, "cm"), legend.key = element_rect(fill = "grey95", 
## colour = "white"), legend.key.size = unit(1.2, "lines"), 
## legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = rel(0.8)), 
## legend.text.align = NULL, legend.title = element_text(hjust = 0), 
## legend.title.align = NULL, legend.position = "right", 
## legend.direction = NULL, legend.justification = "center", 
## legend.box = NULL, legend.box.margin = margin(0, 0, 0, 
## 0, "cm"), legend.box.background = element_blank(),
## legend.box.spacing = unit(0.4, "cm"), panel.background = element_rect(fill = "grey92", 
## colour = NA), panel.border = element_blank(), panel.grid.major = element_line(colour = "white"), 
## panel.grid.minor = element_line(colour = "white", size = 0.25), 
## panel.spacing = unit(half_line, "pt"), panel.spacing.x = NULL, 
## panel.spacing.y = NULL, panel.ontop = FALSE, strip.background = element_rect(fill = "grey85", 
## colour = NA), strip.text = element_text(colour = "grey10", 
## size = rel(0.8)), strip.text.x = element_text(margin = margin(t = half_line, 
## b = half_line)), strip.text.y = element_text(angle = -90, 
## margin = margin(l = half_line, r = half_line)), strip.placement = "inside", 
## strip.placement.x = NULL, strip.placement.y = NULL, strip.switch.pad.grid = unit(0.1, 
## "cm"), strip.switch.pad.wrap = unit(0.1, "cm"), plot.background = element_rect(colour = "white"), 
## plot.title = element_text(size = rel(1.2), hjust = 0, 
## vjust = 1, margin = margin(b = half_line * 1.2)), 
## plot.subtitle = element_text(size = rel(0.9), hjust = 0, 
## vjust = 1, margin = margin(b = half_line * 0.9)),
## plot.caption = element_text(size = rel(0.9), hjust = 1, 
## vjust = 1, margin = margin(t = half_line * 0.9)),
## plot.margin = margin(half_line, half_line, half_line, 
## half_line), complete = TRUE)
## }
## <environment: namespace:ggplot2>

可以看出,源代码主要是theme()函数,设置也很简单:theme(..., complete = FALSE),但是其内含的参数则十分多。

几乎所有元素在theme()里都使用element_lineelement_rectelement_textelement_blank函数设置. 下面就举例稍微讲解一下

#利用数据集mtcars演示head(mtcars)
#先创建p图层
p<- ggplot(data=mtcars, aes(x=wt, y=mpg))+
geom_point(aes(color=factor(cyl)))#先试试图例修改
p+theme(legend.position = "none")#无图例
p+theme(legend.position = "bottom")#图例在底部
#也可以自定义
p+theme(legend.position = c(0.5, 0.7))
#为图例加边界
p+theme(legend.background = element_rect(color="red"))
#或者为图例中的每个元素进行设置,如加边界
p+theme(legend.key =element_rect(color="red"))
#进行填充
p+theme(legend.key = element_rect(fill="yellow"))
#图例内容字体大小、颜色、角度等设置
p+theme(legend.text = element_text(size=25, color="darkred", angle=45))
#为图例标题设置字体、颜色、大小等
p+theme(legend.title = element_text(face="italic", size=25, color="red"))

接下来是坐标以及网格等的自定义

#修改背景颜色
p+theme(panel.background = element_rect(fill="black"))
#修改边界线类型、颜色
p+theme(panel.border = element_rect(linetype = "dashed", color="red"))
#修改网格线p+theme(panel.grid.major = element_line(color="blue", size= 3))
p+theme(panel.grid.minor = element_line(linetype = "dotted", color="red"))

还可以修改x、y轴等,这里懒得讲了,有兴趣的可以自己捣鼓捣鼓

了解theme之后就可以自己定义自己的主题,以后作图就直接像格式刷一样就行

#下面是我比较常用的主题,画图时刷一下就行了
windowsFonts(CA=windowsFont("Calibri"))
mytheme <- theme_bw()+
theme(legend.position = 'top', panel.border = element_blank(), 
panel.grid.major = element_line(linetype = 'dashed'), panel.grid.minor = 
element_blank(), legend.text = element_text(size=9,color='#003087',family = "CA"), 
plot.title = element_text(size=15,color="#003087",family = "CA"), legend.key = 
element_blank(), axis.text = element_text(size=10,color='#003087',family = "CA"), 
strip.text = element_text(size=12,color="#EF0808",family = "CA"), 
strip.background = element_blank())
pie_theme <- mytheme+
theme(axis.text = element_blank(), axis.ticks = element_blank(), axis.title = 
element_blank(), panel.grid.major = element_blank())
myline_blue <- geom_line(color="#085A9C", size=2)
myline_red <- geom_line(color="#EF0808",size=2)
myarea <- geom_area(color=NA,fill="#003087",alpha=0.2)
mypoint <- geom_point(size=3,shape=21,color="#003087",fill="white")
mybar <- geom_bar(fill="#0C8DC4",stat = "identity")
mycolor_3 <- scale_fill_manual(values = c("#085A9C","#EF0808","#526373"))
mycolor_7 <- scale_fill_manual(values=c ("#085A9C","#EF0808","#526373","#FFFFE7","#FF9418","#219431","#9C52AD"))
mycolor_line_7 <- scale_color_manual(values=c ("#085A9C","#EF0808","#526373","#FFFFE7","#FF9418","#219431","#9C52AD"))
#可以来刷一刷#随便建个数据集
x <-rep(1:5, each = 3)
y <-rep(c('A','B','C'),times = 5)
set.seed(1111)
z <-round(runif(min = 10, max = 30, n = 15))
df <-data.frame(x = x, y = y, z = z)
head(df)
##   x   y   z
## 1 1   A   19
## 2 1   B   18
## 3 1   C   28
## 4 2   A   13
## 5 2   B   25
## 6 2   C   30

#柱形图
(p1 <- ggplot(data=df, aes(x=factor(x), y=z, fill=y))+
geom_bar(stat = "identity", position = "dodge")+
ggtitle("自定义主题theme并应用实践"))+
xlab("随便定义了个x")+ylab("随机数")
p1+mytheme
p1+mytheme+mycolor_7


还有线图、饼图等有兴趣的也可以自己刷一刷,你会发现ggplot2的魅力所在就是它拥有无穷的可能性。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,183评论 25 707
  • 简介 文章较长,点击直达我的博客,浏览效果更好。本文内容基本是来源于STHDA,这是一份十分详细的ggplot2使...
    taoyan阅读 51,155评论 7 159
  • 最近朋友圈已经开始在倒数了,今年的电量仅剩20%了。国庆圣诞元旦新年…,一年就快要过完了!再回顾下这一年,列下的书...
    吴在天阅读 877评论 12 14
  • 苦是一种味道苦是一种经历苦是一种快乐苦是一种得到苦是一种营养苦是一种境界当你品尝得了食物的苦,当你承受得了生活的苦...
    Becky的能量加油站阅读 717评论 0 1