ggplot2学习笔记——图例系统及其调整函数

最近确实更得太少了,也不知道自己在忙啥,反正感觉不到忙碌的收获,要不是好多小伙伴儿在后台催更,感觉都快忘了还有要更新公众号这回事儿,

进入2018年以来,1月份更新了3篇,2月份更新了4篇,三月份2篇,自己都感觉过分了哈哈~

今天赶紧找空写一篇~

学过ggplot2的小伙伴儿们大概都了解过,ggplot2的语法系统将数据层和美化层分开,这种理念给了学习更多的选择,你可以只学习数据层,这样大可保证做出正确的图来(虽然质量不敢恭维),也可以同时学习数据层和美化层(当然你要耗费双倍的精力,因为ggplot2理念几个美化的函数模块那是出了名的繁杂)。

最初学习的时候也是各种急功近利,后来才慢慢沉下心来看源文档,逐步系统的总结了其非数据层面的各套系统的设计理念。

今天只讲图例系统,这一块是大部分学习者非常容易忽视的东西(有木有学会ggplot()+geom_xxx就觉得超神了然后自我感慨,哇塞ggplot2原来这么简单,远远没有传说中的那么难耶)。

这么想就不对了,即便你深入掌握了ggplot() + geom_xxx()及其内部参数继承逻辑关系,那也只能保证你正确的做出图来,正确的做出来图并不带表可以把图做好,就像工作不出错并不代表工作出色一样,这样只能打60份,因为图表质量不够,这样使用ggplot2并无法发挥其百分百的功力。

如果你想洞悉ggplot2的全貌,你需要了解除了geom_xxx(stat_xxxx)系统之外的

标度调整系统:

轴标度【scales_x/y_continuous/discrete】、
颜色标度【scale_fill/colour_continuous/discrete/manual】、
透明度标度【scale_alpha_continuous/discrete/manual】、
大小标度【scale_size/radius_area】、
形状标度【scale_shape】、
线条类型标度【scale_linetype】

坐标系系统:

coord_flip()
coord_polar()
coord_map()

图例系统:

guides()
    guide_colorbar()
    guide_legend()

分面系统:

facet_grid()
facet_wrap()

主题系统:

theme()
theme_get()
theme_set(new)
theme_update(...)
theme_replace(...)
e1 %+replace% e2

element_text()
element_rect()
element_line()
element_blank()

文本标签系统:

geom_text()
geom_label()
annotations()
labs()

可以毫不留情的说,以上这些系统的所有内置参数全部罗列出来,没上千也有好几百了,所以学好ggplot2真的任重而道远呀哈哈

本篇只分享图例系统:

guides()

ggplot2的图例系统函数比较分散,在所有标度调整函数(轴标度除外)内部留有guide参数,可以通过guide_colorbar()、guide_legend()两个封装函数来进行图例自定义,但是因为guide_colorbar()、guide_legend()这两个函数也是巨无霸,直接写在scale_xxx这种本身就是巨无霸的函数内部,整个代码简直不堪重负。

所以我喜欢写在单独调整图例的函数guides函数中,它在语法层次上是与scale_xxx类的标度调整函数平行的。

按照美学映射给变量的类型来划分,图例一共分两类,连续性颜色标度的图例叫做colobar,离散颜色标度的图例和所有非颜色图例(透明度、大小、形状、线条)叫做legend。

那么对应的图例调整函数就是:

guide_colorbar()
guide_legend()

所以写在guides中的格式应该是这样的:

guides(
colour/fill = guide_colorbar(), #连续型变量
colour/fill = guide_legend(),   #离散型变量
size        = guide_legend(),
shape       = guide_legend(),
linetype    = guide_legend(),
alpha       = guide_legend()
)

假设你的图表中使用了这么多的图层(事实上不可能,多于两个就灰常难以理解了),那么每一个标度名称对应一个标度调整函数。

那么接下来,我们就要看下具体的标度调整函数内部都是些什么神秘兮兮的玩意儿啦~

library("ggplot2")

guide_colorbar

function (title = waiver(), title.position = NULL, title.theme = NULL, 
    title.hjust = NULL, title.vjust = NULL, label = TRUE, label.position = NULL, 
    label.theme = NULL, label.hjust = NULL, label.vjust = NULL, 
    barwidth = NULL, barheight = NULL, nbin = 20, raster = TRUE, 
    ticks = TRUE, draw.ulim = TRUE, draw.llim = TRUE, direction = NULL, 
    default.unit = "line", reverse = FALSE, order = 0, ...) 
{    if (!is.null(barwidth) && !is.unit(barwidth)) 
        barwidth <- unit(barwidth, default.unit)    if (!is.null(barheight) && !is.unit(barheight)) 
        barheight <- unit(barheight, default.unit)
    structure(list(title = title, title.position = title.position, 
        title.theme = title.theme, title.hjust = title.hjust, 
        title.vjust = title.vjust, label = label, label.position = label.position, 
        label.theme = label.theme, label.hjust = label.hjust, 
        label.vjust = label.vjust, barwidth = barwidth, barheight = barheight, 
        nbin = nbin, raster = raster, ticks = ticks, draw.ulim = draw.ulim, 
        draw.llim = draw.llim, direction = direction, default.unit = default.unit, 
        reverse = reverse, order = order, available_aes = c("colour", 
            "color", "fill"), ..., name = "colorbar"), class = c("guide", 
        "colorbar"))
}
<environment: namespace:ggplot2>

guide_legend

function (title = waiver(), title.position = NULL, title.theme = NULL, 
    title.hjust = NULL, title.vjust = NULL, label = TRUE, label.position = NULL, 
    label.theme = NULL, label.hjust = NULL, label.vjust = NULL, 
    keywidth = NULL, keyheight = NULL, direction = NULL, default.unit = "line", 
    override.aes = list(), nrow = NULL, ncol = NULL, byrow = FALSE, 
    reverse = FALSE, order = 0, ...) 
{    if (!is.null(keywidth) && !is.unit(keywidth)) 
        keywidth <- unit(keywidth, default.unit)    if (!is.null(keyheight) && !is.unit(keyheight)) 
        keyheight <- unit(keyheight, default.unit)
    structure(list(title = title, title.position = title.position, 
        title.theme = title.theme, title.hjust = title.hjust, 
        title.vjust = title.vjust, label = label, label.position = label.position, 
        label.theme = label.theme, label.hjust = label.hjust, 
        label.vjust = label.vjust, keywidth = keywidth, keyheight = keyheight, 
        direction = direction, override.aes = rename_aes(override.aes), 
        nrow = nrow, ncol = ncol, byrow = byrow, reverse = reverse, 
        order = order, available_aes = c("any"), ..., name = "legend"), 
        class = c("guide", "legend"))
}
<environment: namespace:ggplot2>

原函数是这样的,是不是看着很晕呀哈哈,ggplot2里面随便一个函数都是这样的,不用太惊讶。

我大致过滤了以下,筛选出来这么几个觉得长用到的有价值的函数如下:

实际上主要的参数只有三大类:主要作用于图例标题、图例文本标签,以及图例箱体。

图例标题:

title                         
title.vjust
title.hjust

图例文本标签系统:

label                       
label.position
label.vjust
label.hjust
direction

图例箱体函数:

arguments  guide_colorbar         guide_legend
size         barwidth/barheight         key.width/key.height/key.size      
分箱数       nbin                        nrow/ncol/byrow                                   
刻度线       ticks/draw.ulim/draw.llim

barwidth/barheight用于调整矩形色块的宽高属性,nbin控制颜色的分割区间(分割越多,过渡越自然),ticks控制是否显示刻度线。 key.width/key.height/key.size用于控制图例(除连续型颜色之外)中小矩形块(key)的宽、高、大小。 nrow/ncol/byrow 用于控制小举行块的整体布局,排列成几行、几列、排列依据(按行排还是按列排)

连续型颜色标度的图例和其他图例唯一的去别家仅仅在于外观上,连续型颜色图例是一个封闭的矩形色条,而其他图例都是有小方块 构成的一组数据条(小方格称之为key)。所以在调整图例箱体上,二者的函数略有区别。

接下来通过一个简单的例子来实操以上图例调整函数。

mydata5 <- data.frame(
  x = runif(100,0,100),
  y = runif(100,0,100),
  z = runif(100,0,100),
  f = runif(100,0,100),
  g = rep(LETTERS[1:5],each = 20)
)
p <- ggplot(mydata5,aes(x,y))+
  geom_point(aes(fill = z,size = f ),shape = 21);p
colorbar = guide_colorbar(
  title = 'Colorbar',
  title.position = 'left',  #left,right,top,bottom
  title.theme = element_text(size = 15,face = "italic",colour = "red",angle = 45),
  title.hjust =  .5,
  title.vjust =  0,
  label = TRUE,
  label.position = 'top',
  label.theme = element_text(size = 15,face = "italic",colour = "red",angle = 45),
  label.hjust = .5,
  label.vjust = .5,
  barwidth = unit(6,"cm"),  #Default value is legend.key.width or legend.key.siz
  barheight = unit(1.2,"cm"),  #Default value is legend.key.height or legend.key.size
  nbin = 20,
  ticks = TRUE,
  draw.ulim = TRUE,
  draw.llim = TRUE,
  direction = "horizontal",  #"horizontal" or "vertical."
  reverse = TRUE,
  order = 1)
size_legend = guide_legend(
  title = 'legend',
  title.position = "left",
  title.hjust =  .5,
  title.vjust = .5,
  title.theme = element_text(size = 15,face = "italic",colour = "red",angle = 45),
  keywidth = 2.5,
  keyheight = 2,
  label.position = "bottom",
  direction = "horizontal",
  label = TRUE,
  label.hjust = 0.5,
  label.vjust = 0.5,
  label.theme = element_text(size = 15,face = "italic",colour = "red",angle = 45),
  nrow = 2,
  byrow = TRUE,
  reverse = TRUE,
  order = 2)
p + scale_fill_gradient(breaks = seq(0,100,10)) +
  scale_size_area(breaks = seq(0,100,10))  +
  guides(fill = colorbar,size = size_legend)

那么除了guides函数之外,还有另外一套图例调整函数分布在theme函数内部(以legend开头的图例系统)。

以上函数中,着重说一下order参数,order参数用于表明图例在图表上显示的顺序(因为在图表中如果有多个美学映射,那么会形成多个图例【如果这些美学映射不是映射在同一个变量上的话】,如果不对图例显示顺序加以限制,那么顺序就会按照底层函数的逻辑呈现,不一定符合我们实际要求)。

好了,关于图例就分享这么多了,下一次分享一下主题系统。

墙裂推荐大家看源文档学ggplot2,源文档才是精品,没有之一~

http://ggplot2.tidyverse.org/reference/

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2018-04-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Petrichor的专栏

深度学习: 局部响应归一化 (Local Response Normalization,LRN)

局部响应归一化(Local Response Normalization,LRN):

95040
来自专栏数据小魔方

如何处理地图投影转换

最近学习地理信息可视化总是遇到投影的麻烦,包括前段时间输出两篇关于simple features的分享中,其中没有特别处理投影的问题,老司机一看就能看出其中存在...

18030
来自专栏深度学习计算机视觉

数据挖掘之数据预处理学习笔记数据预处理目的主要任务

数据预处理目的 保证数据的质量,包括确保数据的准确性、完整性和一致性 主要任务 数据清理 填写缺失的值、光滑噪声数据、识别或者删除离群的点,先解决这些脏数据,否...

30130
来自专栏数据小魔方

R语言数据可视化之——TreeMap

今天这一篇跟大家分享R语言数据可视化之——TreeMap。 在R语言中制作树状图需要独立的树状图工具包——TreeMap的支持。 该包中提供特有的treemap...

34040
来自专栏和蔼的张星的图像处理专栏

暗通道去雾改进算法及实现

上次搞的暗通道去雾的算法交给老师就算是交差了,当时也就是个调研而已。前几天又被老师叫过去说还是需要720p(1280*720)图像的实时处理,看能不能再做一些优...

37720
来自专栏数据小魔方

仿经济学人——矩阵气泡图

本篇文章案例来源于经济学人2013年一幅关于家庭支出结构与国家间的交叉对比图。 该图信息量相当丰富,至少涵盖了四个维度的信息,支出结构信息(类别型字段)、国别信...

43760
来自专栏自然语言处理

结巴中文分词原理分析2

其中prob*.py的文件是作者事先训练好的模型参数(λ=(A,B,π)),如状态转移概率、发射概率等。真正的代码数也就:304+53+578+107+31+5...

20010
来自专栏Hadoop数据仓库

HAWQ + MADlib 玩转数据挖掘之(八)——聚类方法之k-means

一、聚类方法简介         所谓“物以类聚,人以群分”,其核心思想就是聚类。通过聚类,人们能意识到密集和稀疏的区域,发现全局的分布模式,以及数据属性之间有...

28650
来自专栏专知

【专知-PyTorch手把手深度学习教程07】NLP-基于字符级RNN的姓名分类

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

737130
来自专栏目标检测和深度学习

教程 | 如何使用DeepFake实现视频换脸

1.7K20

扫码关注云+社区

领取腾讯云代金券