ggplot2 001 图形语法

ggplot2是R语言最流行的第三方扩展包,包名中“gg”是图形语法(grammar of graphics)的简称,Wickham Hadley将这套语法诠释如下:
一张统计图形就是从数据到几何对象(geometric object,缩写geom)的图形属性(aesthetic attribute,缩写aes)的一个映射。此外,图形中还可能包含数据的统计变换(statistical transformation,缩写stats),最后绘制在某个特定的坐标系(coordinate system,缩写coord)中,而分面(facet)则可以用来生成数据不同子集的图形。

1.ggplot2绘图语言组件:

  • 1.1 data:数据
  • 1.2 mapping:一系列数据中的变量对应到图形属性的映射aes()
  • 1.3 layer:图层,由几何元素及统计变换组成
    -1.3.1 geom:几何对象,也即在图中实际看到的元素
    -1.3.2 stats:统计变换,对数据进行的某种汇总
  • 1.5 scale:标度,将数据的取值映射到图形空间,如颜色,大小,形状等表示不同的取值,展现标度的常见做法是绘制图例和坐标轴
  • 1.6 facet:分面,描述如何将数据分解为各个子集,以及如何对子集作图并联合进行展示
  • 1.7 coord:坐标系,描述了数据如何映射到图形所在的平面,同时提供了看图所需的坐标轴以及网格线
  • 1.8 theme:主题,控制各点的精细显示,如字体大小及背景颜色

2.ggplot语法

2.1 ggplot语法架构

ggplot语法框架

2.2 绘图语法构成

ggplot(data = NULL, mapping = aes()) +            # 基础图层,不出现图形元素    
geom_XXX() +                                      # 几何图层                                
stat_XXX() +                                      # 统计变换                                
scale_XXX() +                                     # 度量调整,调整具体的标度                                         
coord_XXX() +                                     # 坐标变换,默认为笛卡尔坐标系
facet_XXX() +                                     # 分面系统,将某个变量进行分面变换
guides() +                                        # 图例调整
theme()                                           # 主题设定
2.2.1 ggplot()

ggplot()是底层绘图函数,其中data为主要是数据框(data.frame)格式的数据集;MAPPING 变量的视觉通道映射,用来表示变量 x 和 y,还可以用来控制颜色(color),大小(size)或形状(shape)等视觉通道;STAT 表示统计变换,与 stat_xxx()相对应,默认为“identity”(无数据变换);POSITION 表示绘图数据系列的位置调整,默认为“identity”(无位置调整)。

2.2.2 geom_xxx(),stat_xxx()

通常情况下,绘图使用几何对象函数 geom_xxx(),只有当绘图表涉及统计变换时,才会用统计变换函数 stat_xxx(),比如绘制带误差线的均值散点图或者柱形图等。根据函数输入的变量总数与数据类型,大致可以将函数分为三个大类,六个小类。
https://mubu.com/doc/1Oz9rtR8kne

geom & stat
2.2.3 aes() 视觉通道映射

视觉映射参数需要个性化映射时(也即一一对应),此时参数应写在aes()内部,而如果是需要统一设定某些图表元素对象时,应将参数写在aes()外部

  • color
    指定点,线,和填充区域轮廓的颜色。
  • fill
    指定填充区域颜色。
  • alpha
    指定颜色的透明度。0(完全透明)~ 1(不透明)
  • stroke
    轮廓线条的粗细
  • size
    指点的尺寸或线的宽度,默认单位是 mm,可以在 geom_point()函数绘制的散点图上,添加 size的映射,从而实现气泡图。
  • group
    分组映射的变量
  • fontface
    使用的字形,plain=常规体,bold=粗体,italic=斜体,bold.italic=粗斜体
  • family
    字体内置只有三种:sans, serif, mono,但是可以指定字体(可用 extrafont 扩展包),需要提前设置好字体,然后才可以用family来修改字体。
  • angle
    指角度,只有部分几何对象。如geom_text()函数中的文本放置角度,geom_spoke()函数中的短棒的摆放角度。
  • vjust和 hjust
    是与位置调整有关的视觉通道映射参数。其中,vjust 是指垂直位置微调,在(0, 1)区间的数字或位置字符串。0=“button”, 0.5="middle", 1="top",hjust 是指在水平位置的微调,在(0, 1)区间的数字或位置字符串:0=“left”, 0.5="center", 1="right"。
  • linetype
    是指线条的类型(数字或字符线型)。白线(0="blank"),实线(1="solid"),短虚线(2="dashed"),点线(3="dotted"),点横线(4="dotdash"),长虚线(5="longdash"),短长虚线(6="twodash")
  • shape
    点的形状,为[0, 25]区间的 26 个整数
2.2.4 scale_X_XX() 度量调整

度量调整用于控制变量映射到视觉对象的具体细节,比如:x轴和 y 轴、透明度、轮廓颜色、填充色、线形状、形状等,它们都有对应的度量函数。根据视觉通道映射的变量属性,可以将度量函数分成数值型和类别型变量两大类​
ggplot2 的默认度量为scale_xxx_identity():scale_color_identity(), scale_fill_identity(), scale_shape_identity(), scale_linetype_identity(), scale_alpha_identity(), scale_size_identity(), scale_discrete_identity(), scale_continuous_identity()

  • x,y轴
    连续变量:scale_x_continuous(),scale_y_continuous(),scale_x_log10()/sqrt(),scale_x_log10()/sqrt(),scale_x_reverse() ,scale_y_reverse()
    离散变量:scale_x/y_discrete()
  • colour,fill 轮廓及填充色
    连续变量:scale_colour/fill_continuous(),scale_colour/fill_distiller(),scale_colour/fill_gradient(),scale_colour/fill_gradient2(),scale_colour/fill_gradientn()
    离散变量:scale_colour/fill_discrete(),scale_colour/fill_brewer(),scale_colour/fill_manual()
  • alpha 透明度
    连续变量:scale_alpha_continuous()
    离散变量:scale_alpha_discrete(),scale_alpha_manual()
  • shape 性状
    离散变量:scale_shape(),scale_shape_manual()
  • size 大小
    连续变量:scale_size(),scale_size_area()
    离散变量:scale_size_manual()
2.2.5 coordinate 坐标系
  • 直角坐标系(rectangula coordinate)
    coord_cartesian():默认的直角坐标系
    coord_fixed():固定纵横比的直角坐标系
    coord_flip():坐标轴反转,参数与 coord_cartesian一致
    coord_trans():将数据转换为想要的形式,再进行作图,最常见的是取对数
  • 极坐标系(polar coordinate):
    coord_polar():将坐标系从直角坐标系转换为极坐标系。
  • 地理坐标系(geographic coordinate)
    coord_map()函数
    coord_quickmap()函数
2.2.6 guide 图例

调整连续变量的图例:guide_colorbar()/guide_colourbar(),guide_legend()
调整离散变量的图例:guide_legend()
也可以在 scale_xxx()度量中指定 guide 类型,guide="colorbar"或 guide="legend"

2.2.7 theme 主题系统

主题系统包括绘图区背景、网格线、坐标轴线条灯图表细节部分
文本(text):element_text()
矩形(rect):element_rect()
线条(line):element_line()
element_back:表示设置为无

2.2.8 位置调整
  • 在 geom_xxx()函数中,参数 position 表示绘图数据系列的位置调整,默认为“identity”
  • position参数:position_dodge(),水平并排放置 ;position_identity(),位置不变;position_stack(),垂直堆叠;position_fill(),百分比填充;position_jitter(),扰动处理;position_jitterdodge(),并排抖动 ;position_nudge(),整体位置微调
2.2.9 色彩搭配
  • RColorBerwer 调色代码:通过display.brewer.all()显示
  • 离散型颜色主题:
# Library(RColorBrewer)
p + scale_fill_brewer(palette="Set1")
# Library(viridis)
p + scale_fill_viridis(option = "plasma", discrete = TRUE)
# Library(wesanderson)
p + scale_fill_manual(values=wes_palette("Darjeeling1")[c(1,3,5)]),
p + scale_fill_manual(values = c("#E7298A", "#66A61E", "#E6AB02"))
  • 连续型颜色主题:
# Library(RColorBrewer)
p + scale_fill_distiller(palette = "RdYIBu")
# Library(viridis)
p + scale_fill_virdis(option = "viridis", descrete = FALSE)
# 自定义连续的颜色条,mean(df$age)表示 age 均值对应中间色 white
p + scale_fill_gradien2(low = "#00A08A", mid = "white", high="#FF0000", midpoint = mean(df$age))
# R 语言预色调色板 terrain.colors()
p + scale_fill_gradientn(colors = terrain.colors(10))

Reference

R语言数据可视化之美-专业突变绘制指南(增强版),张杰

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