其他

R|ggplot2(七)|自定义主题

2017-11-26 dwzb R语言中文社区

作者:dwzb,R语言中文社区专栏作者。知乎专栏:https://zhuanlan.zhihu.com/Data-AnalysisR


第一篇戳:R|ggplot2(一)|一个完整的绘图流程

第二篇戳:R|ggplot2(二)|覆盖柱状图各种需求

第三篇戳:R|ggplot2(三)|coord 系列函数坐标轴转换

第四篇戳:R|ggplot2(四)|stat_ geom_ 和position

第五篇戳:R|ggplot2(五)|scale 修改默认设置

第六篇戳:R|ggplot2(六)|套用主题模板


首先我们做出一张图

library(ggplot2) p1 <- ggplot(mtcars, aes(factor(cyl))) +  geom_bar(aes(fill = factor(gear)),               width = 0.6) +  geom_text(width = 0.6, stat = "count",            label = table(mtcars$cyl),            vjust = -0.5, size = 4, color = "red") +  labs(title = "标题",       subtitle = "副标题",       caption = "图一",       x = "cyl",       fill = "gear") # 更改图例名 p1

我们知道,主题设置无非设置一些字体、大小、颜色、摆放位置之类的东西,但是我们首先要弄清楚哪些地方归theme管,这样有需求时才知道要在哪里设置

首先我们列举一下不需要在theme里面设置的地方(只需要看我们之前学过的内容能做哪些事情就可以了)

  • 柱子的颜色,这个我们之前学过在scale里面设置

  • 柱子的粗细,在geom_bar函数中直接设置

  • 柱子上方标注的11 7 14 的大小、颜色等,是在geom_text函数中直接设置

  • 横坐标(468)顺序、内容的改变,纵0 5 10)密集度、内容的改变(scale中设置)

  • 坐标轴的名称(cyl count)、标题与副标题、图例标题 内容的改变(labs中设置)

  • 内部这个图的长宽比例、横纵轴颠倒、统计变换(coord中设置)

还剩下哪些东西呢

  • 标题副标题、横纵坐标轴名称、横纵坐标轴标度的大小、颜色、旋转角度等

  • 图形背景颜色、网格线分布、框边缘的距离等

  • 图例位置等

我们从上面的总结中可以大概感觉出theme主要负责的东西,不涉及图形内容,只是起到修饰作用,下面我们来具体讲解一下theme的使用。

我们看一下下面的例子

p1 + theme_bw() p1 + theme_bw() +  theme(plot.title = element_text(color = "red", # 看标题发生的变化                                  size = 20, # 单位是pts,即像素                                  face = "bold", # 加粗斜体等,可选"plain", "italic", "bold", "bold.italic"                                  hjust = 0.5 # 水平方向位置,取0-1之间的数,默认0靠左,此时0.5居中                              #   vjust = 0.1,# 竖直方向位置(改变angle参数时字书写的方向改变,vjust是与字写的方向垂直的方向)                              #   angle = 90 # 默认正着放是0,取值0-360                                  ),        axis.text.x = element_text( # 看横坐标轴刻度标签的变化                                   size = rel(1.5), # rel表示是原来的多少倍                                   angle = 45),  # 当轴刻度标签名过长时使用        axis.line.x = element_line(color = "red", # 看横坐标轴线的变化                                   size = 2,                                   linetype = 6, # 0-6 各种线型,和基础的plot函数lty参数相同                                   arrow = arrow(angle = 45, # 箭头头的角度                                                 length = unit(0.5, "inches")), # 箭头头的长度                                   lineend = "butt" ,# 线段的头是圆润的、不规则、直角  "round", "butt", "square"                                   inherit.blank = F # 如果T就去掉了这条                                   ),        legend.background = element_rect(fill = "lightgray", # 更改图例背景颜色                                         color = "blue", # 更改图例边框颜色,为了不和下面panel.border冲突就不在此更改                                         linetype = 5, # 外框线的样式                                         size = 2 # 外框线的粗细                                   ),        panel.border = element_blank(), # (绘图区的外框没有了)blank就是去掉 rect的        axis.ticks.y = element_blank(), # (y轴的刻度没有了)去掉line的(text的也能去,但是会出warning)        legend.margin = margin(40,15,10,3), # 三个数按照上右下左的顺序,指定图例的四个方向留多少空隙        legend.key.size = unit(2,"cm") # 指定长度和单位,各种单位可以用?unit查看        )

对比上面两张图来了解theme的调节作用,每一个参数是在调什么我都有用注释标注在后面。上面的代码主要想说明如下内容

  • theme中每个参数(plot.title等)都接的是一个函数,有如下几种

    • element_text

    • element_rect

    • element_line

    • element_blank

    • margin

    • unit

  • 这相当于把theme的参数进行了分类,如文本类的(plot.title axis.text等)都接element_text,线类的(panel.grid.major axis.line等)都接element_line,等等

  • element_text等既然是函数,也要有参数,即color size等,theme文本类的参数共用这些参数。

  • 这样做的一个好处是,文本类的参数需要调整的东西本来就是一样的,如color size等,这样共用可以最小化定义的函数和参数,对比基础绘图中的参数就可以知道

  • 基础绘图中有这样的参数 cex.axis cex.main cex.lab col.axis col.main col.lab等等

  • 这样设置参数是乘数形式地增加,而ggplot2只需要axis main lab 共用cex col等就可以了

  • 上面代码列举了一些参数,覆盖了以上全部6个函数,并列出了每个函数的几乎所有参数的使用方法

下面列出theme函数的众多参数的中文解释以及对应上面六种函数中的哪一种

plot.background        rect       整张图的背景(即去掉绘图区(panel)和图例区(legend)之外的位置 plot.title             text       标题 plot.subtitle          text       副标题 plot.caption           text       下方标题 plot.margin            margin     整张图(绘图区包括标题与图例)与图片边缘的各个方向距离(留白) axis.title             text       坐标轴名称——————细分 axis.title.x  axis.title.y axis.text              text       轴刻度标签——————细分 axis.title.x  axis.title.y axis.ticks             line       轴刻度——————细分 axis.ticks.x  axis.ticks.y axis.ticks.length      unit       轴刻度长度 axis.line              line       坐标轴线——————细分 axis.line.x  axis.line.y panel.background       rect       绘图区的背景 panel.border           rect       绘图区的边界 panel.spacing          unit       多个绘图区之间的距离——————细分panel.spacing.x  panel.spacing.y  (多个绘图区的情况:使用分面) panel.grid             line       网格线——————细分panel.grid.major  panel.grid.minor panel.grid.major.x y panel.grid.minor.x y panel.ontop            T or F     是否将背景覆盖在图形上面(一般panel.background设置透明色"transparent",效果:图形被网格线划分 legend.background      rect       图例背景 legend.margin          margin     图例大小(指定上左下右间隔) legend.key             rect       图例标示的背景(想象成三个小方格压在一块板(背景)上面 legend.key.size        unit       图例标示的大小 legend.key.height      unit       图例标示的高 legend.key.width       unit       图例标示的宽 legend.text            text       图例标示说明文本 legend.text.align      0-1        说明文本与图例标示的对齐(配合legend.key.height使用,图例标示高了调这个才有用) legend.title           text       图例标题 legend.title.align     0-1        图例标题本与图例标示的对齐(配合legend.key.width使用,图例标示宽了调这个才有用) legend.position        可选 "none", "left", "right", "bottom", "top" 或两个数值的向量如c(0.2,0.4)       图例位置 legend.direction       可选"horizontal" or "vertical"   图例方向 legend.box             可选"horizontal" or "vertical"   多个图例的分布(多个图例的情况:只要aes中color指定一个变量,fill再指定一个就可以了) legend.box.background  rect       多个图例整体背景 legend.box.margin      margin     多个图例的整体大小(设置背景之后看起来更方便) legend.spacing         unit       多个图例之间的距离----细分legend.spacing.x  legend.spacing.y legend.box.spacing     unit       多个图例整理与绘图区之间的距离 strip.background       rect        分面后分面标签位置的背景 strip.placement        可选 "inside" or "outside"   分面标签是否与图连在一起 strip.text             text        分面标签文字的样式——————细分 strip.text.x y

下面介绍一些不常见的与theme有关的函数

# theme_set--使用帮助文档中的例子 p1 <- ggplot(mtcars, aes(mpg, wt)) +  geom_point() p1 old <- theme_set(theme_bw()) # 之后作图都使用了theme_bw()主题 p2 <- p1 p1 # p1 p2 都是使用了theme_bw()主题 p2 theme_set(old) # 取消old设置,之后作图都不是theme_bw()主题 p1 # The theme is applied when the plot is drawn, not when it is created. p2 # 这个也不是theme_bw()主题,说明theme_set之后创建的p2和p1还是完全相同的,p2中不包含这个主题,主题是画图时才加上去的() # theme_get p1 + theme_bw() theme_get() # 返回一个list,包括当前theme的所有参数 theme_get()$panel.background # fill是 "grey92",说明没被theme_bw()主题影响 old <- theme_set(theme_bw()) theme_get()$panel.background # theme_set()后fill就是 "white" 了 theme_set(old) # %+replace% str(theme_grey()$text[1:5]) # 原来是这样 # List of 5 # $ family: chr "" # $ face  : chr "plain" # $ colour: chr "black" # $ size  : num 11 # $ hjust : num 0.5 add_el <- theme_grey() + # 用+只修改这一个参数  theme(text = element_text(family = "Times")) str(add_el$text[1:5]) # List of 5 # $ family: chr "Times" # $ face  : chr "plain" # $ colour: chr "black" # $ size  : num 11 # $ hjust : num 0.5 rep_el <- theme_grey() %+replace% # 用%+replace%则text完全变成下面设置的了,没设置的就是NULL  theme(text = element_text(family = "Times")) str(rep_el$text[1:5]) # List of 5 # $ family: chr "Times" # $ face  : NULL # $ colour: NULL # $ size  : NULL # $ hjust : NULL add_el1 <- theme_grey() +  theme_update(text = element_text(family = "Times")) str(add_el1$text[1:5]) rep_el1 <- theme_grey() +  theme_replace(text = element_text(family = "Times")) str(rep_el1$text[1:5]) # 下面这两个函数可以直接修改全局设置 theme_replace(text = element_text(color="red")) # 和%+replace%类似 theme_update(text = element_text(family = "Times")) # 和+类似 theme_get()$text


公众号后台回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

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

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