ggplot2 是一个功能强大且灵活的 R 包,由 Hadley Wickham 编写,它可以生成优雅而实用的图形。ggplot2中 的 gg 表示图形语法(grammar of graphic),这是一个通过使用“语法”来绘图的图形概念。ggplot2 主张模块间的协调与分工,整个 ggplot2 的语法框架,主要包括数据绘图部分与美化部分。ggplot2 图形语法的主要特点如下所示。
采用图层的设计方式,有利于结构化思维实现数据可视化。有明确的起始与终止,图层之间的叠加是靠“+”实现的,越往后,其图层越在上方。通常一条 geom_xxx()函数或 stat_xxx()函数可以绘制一个图层。
将表征数据和图形的细节分开,能快速将图形表现出来,使创造性的绘图更加容易实现。而且通过 stat_xxx()函数将常见的统计变换融入绘图中。
图形美观,扩展包丰富,有专门调整颜色(color),字体(font)和主题(theme)等辅助包。可以帮助用户快速指定个性化的图表。
ggplot2 语法框架
其中所需的图标输入信息如下所示:
ggplot():底层绘图函数。DATA 为数据集,主要是数据框(data.frame)格式的数据集;MAPPING 变量的视觉通道映射,用来表示变量 x 和 y,还可以用来控制颜色(color),大小(size)或形状(shape)等视觉通道;STAT 表示统计变换,与 stat_xxx()相对应,默认为“identity”(无数据变换);POSITION 表示绘图数据系列的位置调整,默认为“identity”(无位置调整)。
geom_xxx() | stat_xxx():几何图层或统计变换,比如常见的 geom_point()(散点图),geom_bat()(柱形图),geom_histogram()(统计直方图),geom_boxplot()(箱型图),geom_line()(折线图)等。我们通常使用 geom_xxx()函数就可以绘制大部分图表。
可选的图表输入信息包括以下 5 个部分,主要是实现图表的美化与变换等。
scale_xxx():度量调整,调整具体的度量,包括颜色(color),大小(size)或形状(shape)等。跟 MAPPINGS的映射变量相对应。
coord_xxx(): 坐标变换,默认笛卡尔坐标系,还包括极坐标系、地理空间坐标系等。
facet_xxx(): 分面系统,将某个变量进行分面变换,包括按行、列和网格等形式分面绘图。
guides(): 图例调整,主要包括连续型和离散型两种类型的图例。
theme(): 主题设定,主要用于调整图表的细节,包括图表背景、网格线的间隔与颜色等。
平时,我们主要使用几何对象函数 geom_xxx(),只有当绘图表设计统计变换时,才会用统计变换函数 stat_xxx(),比如绘制带误差线的均值散点图或者柱形图等。根据函数输入的变量总数与数据类型,大致可以将函数分为三个大类,六个小类。
geom 相关函数
geom_xxx()中,基础的展示元素可以分为四类:点(point),线(line),多边形(polygon)和文本(text)
几何对象函数 | 描述 |
---|---|
geom_abline | 线图,由斜率和截距指定 |
geom_area | 面积图(即连续的条形图) |
geom_bar | 条形图 |
geom_bin2d | 二维封箱的热图 |
geom_blank | 空的几何对象,什么也不画 |
geom_boxplot | 箱线图 |
geom_contour | 等高线图 |
geom_crossbar | crossbar图(类似于箱线图,但没有触须和极值点) |
geom_density | 密度图 |
geom_density2d | 二维密度图 |
geom_errorbar | 误差线(通常添加到其他图形上,比如柱状图、点图、线图等) |
geom_errorbarh | 水平误差线 |
geom_freqpoly | 频率多边形(类似于直方图) |
geom_hex | 六边形图(通常用于六边形封箱) |
geom_histogram | 直方图 |
geom_hline | 水平线 |
geom_jitter | 点、自动添加了扰动 |
geom_line | 线 |
geom_linerange | 区间,用竖直线来表示 |
geom_path | 几何路径,由一组点按顺序连接 |
geom_point | 点 |
geom_pointrange | 一条垂直线,线的中间有一个点(与Crossbar图和箱线图相关,可以用来表示线的范围) |
geom_polygon | 多边形 |
geom_quantile | 一组分位数线(来自分位数回归) |
geom_rect | 二维的长方形 |
geom_ribbon | 彩虹图(在连续的x值上表示y的范围,例如Tufte著名的拿破仑远征图) |
geom_rug | 触须 |
geom_segment | 线段 |
geom_smooth | 平滑的条件均值 |
geom_step | 阶梯图 |
geom_text | 文本 |
geom_tile | 瓦片(即一个个的小长方形或多边形) |
geom_vline | 竖直线 |
stat 转换函数在数据被绘制出来之前对数据进行聚合和其他计算。stat_xxx()确定了数据的计算方法。所以一个 stat()函数必须与一个 geom()函数对应才能进行计算。
我们可以将 geom_xxx()和 stat_xxx()都视作图层。每一个图层都包含一个几何对象和一个统计变换,即每一个以 geom_xxx开头的几何对象都有一个 stat参数,同时每一个 stat_xxx 开头的几何对象也都有一个 geom 参数。
stat 相关函数
统计变换函数 | 描述 |
---|---|
stat_abline | 添加线条,用斜率和截距表示 |
stat_bin | 分割数据,然后绘制直方图 |
stat_bin2d | 二维密度图,用矩阵表示 |
stat_binhex | 二维密度图,用六边形表示 |
stat_boxplot | 绘制带触须的箱线图 |
stat_contour | 绘制三维数据的等高线图 |
stat_density | 绘制密度图 |
stat_density2d | 绘制二维密度图 |
stat_function | 添加函数曲线 |
stat_hline | 添加水平线 |
stat_identity | 绘制原始数据,不进行统计变换 |
stat_qq | 绘制Q-Q图 |
stat_quantile | 连续的分位线 |
stat_smooth | 添加平滑曲线 |
stat_spoke | 绘制有方向的数据点(由x和y指定位置,angle指定角度) |
stat_sum | 绘制不重复的取值之和(通常用在三点图上) |
stat_summary | 绘制汇总数据 |
stat_unique | 绘制不同的数值,去掉重复的数值 |
stat_vline | 绘制竖直线 |
R 语言可用作变量的视觉通道映射参数主要包括 color/col/colour, fill, size, angle, linetype, shape, vjust, hjust。主要说明如下:
color
指定点,线,和填充区域轮廓的颜色。
fill
指定填充区域颜色。
alpha
指定颜色的透明度。0(完全透明)~ 1(不透明)
stroke
轮廓线条的粗细
size
指点的尺寸或线的宽度,默认单位是 mm,可以在 geom_point()函数绘制的散点图上,添加 size的映射,从而实现气泡图。
group
分组映射的变量
fontface
使用的字形
变量 | 字形 |
---|---|
plain | 常规体 |
bold | 粗体 |
italic | 斜体 |
bold.italic | 粗斜体 |
family**
字体内置只有三种:sans, serif, mono,但是可以指定字体(可用 extrafont 扩展包),需要提前设置好字体,然后才可以用family来修改字体。
windowsFonts(myFont1=windowsFont("Times New Roman"),myFont2=windowsFont("华文行楷"))
Family="myfont1"
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 个整数,分别对应:
常见函数的主要视觉通道
元素 | geom_xxx()函数 | 类别型视觉通道映射 | 数值型视觉通道映射 |
---|---|---|---|
点 | geom_point(); geom_jitter(); geom_dotplot() | color; fill; shape | color; fill; alpha; size |
线 | geom_line(); geom_path(); geom_curve();geom_density(); geom_linerange(); geom_step(); geom_abline(); geom_hline()等 |
color;linetype | color; size |
多边形 | geom_polygon(); geom_rect(); geom_bar(); geom_ribbron(); geom_area(); geom_histogram(); geom_violin()等 |
color; fill | color; fill; alpha |
文本 | geom_label(); geom_text() | color | color; angle; vjust; hjust |
度量调整用于控制变量映射到视觉对象的具体细节,比如: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()。需要注意的是:scale*manual()表示手动自定义离散的度量,包括 colour, fill, alpha, linetype, shape和 size 等视觉通道映射参数。其他组合如下:
视觉对象 | 变量类型 | 标度函数 | 描述及关键参数 |
---|---|---|---|
轴 | 连续变量 | scale_x_continuous() | name(坐标轴名称), breaks(指定坐标轴刻度位置), labels(指定坐标轴刻度标签内容), limits(指定坐标轴显示范围), expand(扩展坐标轴显示范围), trans(坐标轴变换函数exp(),log(),log10(), 还支持 scales 包内的其他变换函数,如 scales::precent()), postion(坐标轴的位置) |
scale_y_continuous() | 还有:minor_breaks, sec.axis | ||
scale_x_log10()/sqrt() | 只有trans参数不一样,相当于trans=“log10”/“sqrt” | ||
scale_x_log10()/sqrt() | 只有trans参数不一样,相当于trans=“log10”/“sqrt” | ||
scale_x_reverse() | 翻转x轴,相当于trans=“reverse”,其它参数相同 | ||
scale_y_reverse() | |||
离散变量 | scale_x_discrete() | name,breaks,labels,limits,expand,na.value, position | |
scale_y_discrete() | 与上面相同 | ||
颜色 | 连续变量 | scale_colour_continuous() | type=“gradient”, type=“viridis”(色盲渐变) |
scale_fill_continuous() | |||
连续色板 | scale_colour_distiller() | 将离散色板连续化,来自RColorBrewer色板,type,palette, direction | |
scale_fill_distiller() | |||
连续渐变 | scale_colour_gradient() | 单极渐变, low,high | |
scale_colour_gradient2() | 两极渐变, low,mid,hight | ||
scale_colour_gradientn() | 多色渐变,colors,如colours = terrain.colors(10) | ||
scale_fill_gradient() | |||
scale_fill_gradient2() | |||
scale_fill_gradientn() | |||
离散色板 | scale_colour_brewer() | type, palette,direction指定标度顺序(1/-1) | |
scale_fill_brewer() | |||
自定义 | scale_colour_manual() | values,默认名称属性匹配,否则字母顺序匹配, 因子水平匹配最好 | |
scale_fill_manual() | |||
透明度 | 连续变量 | scale_alpha() | range,limits, breaks, labels |
scale_alpha_continuous() | range,limits, breaks, labels | ||
离散变量 | scale_alpha_discrete() | range,limits, breaks, lables | |
scale_alpha_ordinal() | range,limits, breaks, labels | ||
自定义 | scale_alpha_manual() | values | |
色相 | 离散变量 | scale_colour_hue() | h, c, l, h.start, direction |
scale_fill_hue() | h, c, l, h.start, direction | ||
灰度 | 连续渐变 | scale_colour_grey() | start, end |
scale_fill_grey() | start, end | ||
shape | 离散变量 | scale_shape() | name, limits, breaks, labels |
自定义 | scale_shape_manual() | values | |
线型 | 连续变量 | scale_linetype_continuous() | name, limits, breaks, labels,不常用连续变量 |
离散变量 | scale_linetype() | name, limits, breaks, labels | |
scale_linetype_discrete() | name, limits, breaks, labels | ||
自定义 | scale_linetype() | values | |
尺寸 | 数值 | scale_radius() | 圆半径,name,limits, breaks, labels, range |
数值 | scale_size() | size面积/线宽,参数与radius相同。不建议size映射离散变量 | |
数值 | scale_size_area() | area面积,0映射到零面积,参数与上面相同 | |
自定义 | scale_size_manual() | values | |
时间 | 时间序列 | scale_x_date() | 用于时间轴的标度设置,参数包括:name, breaks,labels |
scale_y_date() | 和:date_breaks(时间跨度), date_labels,limits, expand,position 等 | ||
scale_x_time() | 参数与_date()相同,增加obb参数(out of bounds)处理limits外的数据 | ||
scale_y_time() | |||
scale_x_datetime() | 参数比xxx_date()增加了:timezone | ||
scale_y_datetime() | |||
色盲 | 离散变量 | scale_colour_viridis_d() | 色盲友好颜色,使用viridis colormap色板,参数与下面相同 |
scale_fill_viridis_d() | alpha, begin, end, direction,option,option指定具体的色条 | ||
连续渐变 | scale_colour_viridis_c() | 参数与上面相同,option: “A”=“magma”, “B”=“inferno” | |
scale_fill_viridis_c() | option: “C”=“plasma”, “D”=“viridis”(默认), “E”=“cividis” |
参数解释:
type: 在scale_color_continuous中表示指定变化类型,是普通渐变"gradient"还是色盲渐变"viridis" 在scale_xxx_distiller()中表示指定色板类型,是"seq"渐变,"qual"离散对比,还是"div"两极色板 palette 表示指定色条类型,当type色板类型已经指定的情况下,可以用序号指定,若type未指定,则必须用色条名称指定
direction: 表示指定标度与变量的匹配方向,direction=-1表示方向翻转 在scale_xxx_hue()中,direction=1表示色轮的顺时针方向,direction=-1表示逆时针方向
low, high:表示渐变的颜色两极颜色名称或HEX色值,如果用颜色名称指定,则可用muted("color")指定某个暗色
mid :表示指定渐变的中点颜色
midpoint: 表示指定渐变的中点对应的变量值
colors/colours: 多色渐变中,指定颜色向量, 如colour = terrain.colors(10)取10个地形图颜色作为渐变的基础色
values:表示指定自定义颜色向量,如果变量为数字类型,则默认按数字大小顺序与values匹配, 如果变量为字符类型,则默认按变量字母顺序与values匹配, 为了按照想要的顺序匹配,可以给变量增加一个因子水平,然后自动按照因子水平与values匹配(自上而下,由低到高) 也可给values向量设置名称属性,名称与要映射的变量值一样,然后按照名称属性匹配
range: 表示指定指定显示的透明度范围,在[0, 1]区间内,0表示不透明,1表示不透明
limits: 表示设定显示范围
breaks: 表示设定图例刻度位置
labels 表示指定图例刻度处显示标签
h: 表示指定色相范围,在区间[0, 360]内
c: 表示指定chroma(色度,鲜艳或是暗淡)值,最大值取决于hue和luminance
l: 表示指定luminance(亮度),在区间[0, 100]内
start: 表示指定灰度起点,从0到1,0表示白色,1表示黑色
end: 表示灰度结束点,通常end,默认end更黑,若设定start>end,则翻转标度
其它公共参数:name图例名称,palette, breaks, labels, limits, expand, position(标签在图例的上\下\左\右)
坐标系主要分为直角坐标系(rectangula coordinate)、极坐标系(polar coordinate)和地理坐标系(geographic coordinate)。
需要注意的是:时间坐标轴刻度函数 scale_xxx_date()要求是 Date 格式;scale_xxx_datetime()要求变量是 POSLXct 格式;scale_xxx_time()要求是 hms 格式。
直角坐标系,也叫笛卡尔坐标系 ,是最常用的坐标系。直角坐标系包括:
coord_cartesian()
默认的直角坐标系
参数:
xlim: x 轴的范围
ylim: y 轴的范围
expand: xlim = NULL, ylim = NULL, expand = TRUE
coord_fixed()
固定纵横比的直角坐标系
参数:
xlim: x 轴的范围
ylim: y 轴的范围
expand: xlim = NULL, ylim = NULL, expand = TRUE
ratio: ratio=2则图形高和宽的比是2:1,即纵轴的1cm显示出来的长度是横轴的两倍。所以ratio越小,图形越扁
coord_flip()
坐标轴反转,参数与 coord_cartesian一致
coord_trans()
将数据转换为想要的形式,再进行作图,最常见的是取对数。
我们平时使用的雷达图、饼图等就是极坐标系。极坐标系是指在平面内由极点、极轴和极径。
coord_polar()
将坐标系从直角坐标系转换为极坐标系。
参数:
theta: 要极坐标话的中心轴,即 X轴转换为圆周,Y 轴转换为半径。
start: 表示起始角度。
direction: 表示排列方向。1表示顺时针,-1表示逆时针。
clip:
可以使用 coord_map()函数和 coord_quickmap()函数设定坐标系为地理空间坐标系。
图例作为图表背景信息的重要组成部分,对图表的完整与表达尤为重要。ggplot2 用 guide_colorbar()/guide_colourbar()函数调整连续变量的图例,guide_legend()函数用于离散变量的图例,也可用于连续变量。
guides()函数将 guide_colorbar 和 guide_legend 两种图例嵌套进去,方便映射与处理。如 guides(fill = guide_colorbar()),对多个图例共同处理的时候尤为有效。另外,也可以在 scale_xxx()度量中指定 guide 类型,guide="colorbar"或 guide="legend"。
主题系统包括绘图区背景、网格线、坐标轴线条灯图表细节部分。主要对象包括文本(text)、矩形(rect)和线条(line)三大类,对应函数包括element_text()、element_rect()、element_line(),另外 element_back()表示设置为无。具体如下:
对象 | 函数 | 图像对整体 | 绘图区(面板) | 坐标轴 | 图例 | 分面系统 |
---|---|---|---|---|---|---|
text | element_text() 参数: family, face, colour, size, hjust, vjust, angle, lineheight |
plot.title plot.subtitle plot.caption |
axis.title axis.title.x axis.title.y axis.text axis.text.x axis.text.y |
legend.text legend.text.align legend.text.title legend.text.align |
strip.text strip.text.x strip.text.y |
|
tect | element_rect() 参数: colour, size, type |
plot.background plot.spacing plot.margin |
panel.background panel.border panel.spacing |
legend.background legend.margin legend.spacing legend.spacing.x legend.spacing.y |
strip.background | |
line | element_line() 参数: fill, colour, size, type |
panel.grid.major panel.grid.minor panel.grid.major.x panel.grid.major.y panel.grid.minor.x panel.grid.minor.y |
axis.line axis.line.x axis.line.y axis.ticks axis.ticks.x axis.ticks.y axis.ticks.length axis.ticks.margin |
在 geom_xxx()函数中,参数 position 表示绘图数据系列的位置调整,默认为“identity”。具体参数如下
函数 | 功能 | 参数说明 |
---|---|---|
position_dodge() | 水平并排放置 | width; preserve |
position_identity() | 位置不变 | |
position_stack() | 垂直堆叠 | vjust; revers |
position_fill() | 百分比填充 | vjust; revers |
position_jitter() | 扰动处理 | width; height |
position_jitterdodge() | 并排抖动 | width; jitter.height; dodge.width |
position_nudge() | 整体位置微调 | x; y |
离散型颜色主题方案
颜色度量语句 | 说明 |
---|---|
p + scale_fill_brewer(palette="Set1") | Library(RColorBrewer) |
p + scale_fill_viridis(option = "plasma", discrete = TRUE) | Library(viridis) |
p + scale_fill_manual(values=wes_palette("Darjeeling1")[c(1,3,5)]) | Library(wesanderson) |
p + scale_fill_manual(values = c("#E7298A", "#66A61E", "#E6AB02")) |
连续型颜色主题方案
颜色度量语句 | 说明 |
---|---|
p + scale_fill_distiller(palette = "RdYIBu") | Library(RColorBrewer) |
p + scale_fill_virdis(option = "viridis", descrete = FALSE) | Library(viridis) |
p + scale_fill_gradien2(low = "#00A08A", mid = "white", high="#FF0000", midpoint = mean(df$age)) | 自定义连续的颜色条,mean(df$age)表示 age 均值对应中间色 white |
p + scale_fill_gradientn(colors = terrain.colors(10)) | R 语言预色调色板 terrain.colors() |
RColorBerwer 调色代码(也可通过display.brewer.all()显示)