Rggplot2可视化手册
- 每一个图层都是按照ggplot对象的先后顺序绘制的;在覆盖的问题上,可参考该顺序
输出图形
输出图形为PDF、矢量图、其他图形
width与height 默认单位为 英寸;
- ggsave(filename, plot=last_plot, device=NULL, path=NULL, scale=1, width=NA, height=NA, units=””, dpi=300, limitsize=TRUE,…) :保存图形
- 使用ggsave时无需打印ggplot对象,并且在创建过程中若出现错误也无需手动关闭设备
filename : 保存的文件名
device :使用的设备; 可为
"eps","ps","tex"(pictex),"pdf", "jpeg", "tiff", "png", "bmp", "svg", "wmf"(windows only)
units = c(“in”, “cm”, “mm”) :可选的单位;默认为 英寸(in)
limitsize= TRUE :大小限制;若为TRUE,将不会保存大于50 $\times$50 英寸的图形
- 使用传统方法调用时可能出现的问题
- 在使用某个脚本来创建图形的过程中抛出一个错误,则R可能无法执行到dev.off() ,并可能停留在设备pdf/png等仍然开启的状态。
- 当这种情况发生时,直到你手动调用dev.off() 之前,pdf/png文件将无法用程序正常打开
- 使用ggplot2的语法
ggsave()
:保存使用ggplot() 创建的最后一幅图形- ggsave无法用于创建多页图形
|
|
可能会出现字体无法匹配的情况,可通过添加
useDingbats=FALSE
来处理
1234 > pdf("", useDingbats=FALSE)>> ggsave("", useDingbats=FALSE)>
- 打开设备 — 绘制图形 — 关闭图形设备(适用于R中大多数图形,包括ggplot2 和 lattice绘制的图形)
- 绘制多幅图形,希望每一幅占据一页
对ggplot调用print,确保这段代码即使在一段脚本中也能调用
|
|
矢量图
- eps & svg格式
|
|
- wmf : Windows图元文件
- 不支持透明
|
|
位图
- png / tiff
默认单位为 像素 ,默认的输出分辨率为72像素(pi);这一分辨率适合在屏幕上显示,但在打印时会显得模糊;
- 对于高质量的打印输出,分辨率至少应该在 300ppi
使用ggsave()中的参数虽名为
dpi
, 但它实际上控制的是每英寸的像素数(pixels per inch ,ppi) ,而非每英寸的点数(dots per inch, dpi)。
|
|
图形的默认属性
参数 | 默认值 | 图形 |
---|---|---|
position = | “stack” | geom_histogram |
position_dodge() | 0.9 | |
position = | “dodge” | geom_bar |
width = | 0.9 | geom_bar |
size = | 5 | geom_text |
size = | 2 | geom_point |
scales = | “fixed” | facet_grid |
bins = | 30 | stat_bin2d |
method = | loess | stat_smooth |
level = | 0.95 | stat_smooth |
条形图
- width =0.9
- position = position_dodge(0.9)
文本标签
- size = 0.9; size= rel(0.9)
描述数据分布
直方图
- geom_histogram():映射一个连续变量到参数x
bins = n;组的数量(即出现n条柱子)
binwidth = n ;组距宽度,(看做分隔范围的大小;表示每个柱子的宽度)
position = “stack” (默认);位置调整
- position= “identity” :不做任何调整
- position= “dodge” :避免重叠,并列排放;
|
|
分组直方图
多组数据的直方图;geom_histogram()
分面 - facet_grid/wrap
- faect_grid(smoke.~ , scales = “free”, position=)
smoke ~ . :一列多行,根据变量smoke进行分面为n行
. ~ a # 一行多列,根据变量a进行分面为n列
a ~. # 一列多行,根据变量a进行分面n行
a~b # 多行多列
.~a+b / a+b~. # 多个变量的多个水平在行/列上(或同时)
scales = “fixed” (默认) ; 标度控制;即所有面板中x/y标度相同
scales = “free” ;x/y每个面板的标度都可以变化; 自由标度,用于发现更多的细节
scales = “free_x” / “free_y”
- facet_wrap(~a, ncol=n)
- 处理单个多水平变量时更适用,因为可以自定义行列数;
- 此时结合 scales=”free” 更容易看出图形的趋势
~ a, ncol=n
~a, nrow=n
|
|
- 分面标签:分面绘图有一个问题:即分面标签只有0和1,且没有指明这个标签变量smoke的取值;因此需要修改标签,即修改因子水平的名称;
- 列出现有的因子水平 (因为分面没有指明这个标签的取值,重要)
- 依据相同的顺序赋予新的名字
|
|
- 分面y轴刻度:可选择根据不同面板自动调整标度;选择
scales="free"
- 可以单独设定分面y轴/x轴的标度;但这种设定根据分面的形式而有所不同
smoke ~ .
:一列多行,此时x轴是固定的;此时scales="free"
等价于scales="free_y"
. ~ smoke
:一行多列,此时y轴是固定的;此时scales="free"
等价于scales="free_x"
- 可以单独设定分面y轴/x轴的标度;但这种设定根据分面的形式而有所不同
|
|
分组 - fill
将分组变量映射给
fill
;此处分组变量必须是 因子型 或 字符型 向量
|
|
密度曲线
核密度曲线是基于样本数据对总体分布做出的一个估计。
曲线的光滑程度取决于核函数的带宽:带宽越大,曲线越光滑;
- geom_density():映射一个连续变量到x;
- 绘制的为封闭的多边形
|
|
开放的密度曲线
- geom_line(stat=”identity”):绘制没有两侧与底部线段的核密度曲线
|
|
分组密度曲线
频数多边形
频数多边形传递的信息类似直方图
- geom_freqploy()
binwidth= n ;设定每组的组距(即宽度)
|
|
箱线图
- geom_boxplot():分别映射一个连续型变量 和 一个离散型变量到 y 和 x ;
- 绘制单组数据的箱线图时,必须给x参数映射一个特定的取值;可以将其设为1
width = ;修改箱线图的宽度
outlier.size = ;设置异常值的大小
outlier.shape = ;设置异常值的形状
notch= TRUE ; 显示槽口(槽口(notch)的目的是易于比较各组数据的中位数的差异;)
|
|
添加均值
- stat_summary():
|
|
常规图形
条形图、折线图、面积图、散点图
条形图
geom_bar(stat=”identity”) :一列数据表示条形在x轴上的位置,另一列数据表示每个条形在y轴上对应的高度
- 当x为连续型变量,通过factor() 转为离散型变量
当x是连续型(数值型)变量时,ggplot不是只在实际取值处绘制条形,而是将在x轴上结余最大值和最小值之间所有可能的取值处绘制条形
fill = ; 条形的填充色
color = ;添加并框线,并指定颜色
size = ;用来控制边框线宽度的参数,单位是毫米;(当设定了边框线颜色color)
position = “”
stack - 堆叠;fill - 堆叠并标准化为1; dodge - 分组条形图; jitter - 扰动; identity - 不做调整
width= ;条形的宽度
最大宽度为1
簇状条形图组内的条形间距为0
|
|
条形图 - 簇状条形图
并排展示的条形图;
若分类变量个水平的组合中有确实项,绘图的条形会略去不进行绘制,并将条形自动扩充到相应的位置(即宽度变宽)
- 将分类变量映射到fill,并运行geom_bar(position=”dodge”)
position=”dodge” 是默认参数0.9的position_dodge()的缩写;即默认组间宽度为0.9
|
|
条形图 - 频数
- geom_bar(),同时不映射任何变量到y参数
- 当x为连续变量时,会得到一张直方图
stat = “bin” (默认);该操作会自动计算每组变量对应的频数
|
|
条形图 - 正负分别着色
- 创建一个对取值正负情况进行标识的变量pos
- 将该变量作为映射给fill
- 通过scale_fill_manual(values=c(), guide=FALSE) :指定正负条形图的颜色,去掉图示
|
|
条形图 - 宽度与间距
- 通过geom_bar()的width 控制条形的宽度
- 运行geom_bar(width=0.9)时,每组条形将在x轴上占据0.9个单位宽度
- 运行position_dodge(width=0.9)时,会自动调整图形位置,使每个条形的中心恰好位于当每组条形宽度为0.9,且组内条形紧贴在一起时的位置
width=0.9 (默认);较窄的可设为0.5;最大宽度为1
簇状条形图组内的条形间距为0;若希望增加组内条形的间距
- 将widht 设定的小一点
- 并令 position_dodge的取值大于 width; position_dodge(width=0.9) 默认
|
|
条形图 - 堆积条形图
- 使用geom_bar() ,并映射一个变量给填充色参数fill
- 通过guides调整图例顺序
- 通过order=desc() 来调整堆叠顺序
|
|
条形图 - 百分比堆积条形图
- 先对每组条形对应的数据标准化为100%格式; ddply() 、 transform()
- 对之后的结果绘制堆积条形图
|
|
Cleveland图
使用Cleveland点图来替代条形图以减少图形造成的视觉混乱并使图形更具可读性
- geom_point()
- 通过reorder():实现排列的自定义
reorder(name,avg)
:该命令会先将name转化为因子,然后根据avg对其进行排序- 为了使图形效果更好,可删除垂直网格线,并将水平网格线改为虚线
- 涉及根据两个及以上变量进行分组与排序时,只能分步实现
- 通过reorder():实现排列的自定义
|
|
- geom_segment():绘制数据点为端点的线段;
- 需要设定x /y /xend /yend 四个参数
|
|
环状图形
饼图实际上就是柱状图,只不过是使用极坐标而已,柱状图的高度,对应于饼图的弧度
- coord_polar(theta = “x”, start = 0, direction = 1): 非笛卡尔坐标;使用环形图
- 根据数据源的不同有不同的做法:
- 长格式,映射的为列中某个变量的频数;
- 宽格式,映射为某个列中具体的值(同Excel,具体的值已经经过计算)
- 先制作堆积条形图(1. 堆积条形图; 2. 簇状条形图)
- 根据数据源的不同有不同的做法:
theta: variable to map angle to (x or y)
start:offset of starting point from 12 o’clock in radians
direction, 1, clockwise; -1, anticlockwise
- 长格式
|
|
geom_bar() 中 width>=1,中心的白点会去掉
- 宽格式
- ggplot(x=””) ;x为空,并且不要指定group
- 若x = colname ,饼图的长度(离圆心的距离)会根据比例不同而不同
|
|
|
|
原始图形
|
|
去除饼图中心的杂点
|
|
去除饼图旁边的标签、刻度须线
|
|
图例
|
|
按顺时针从大到小的顺序显示
- 数据源的排列顺序,需要与因子的顺序相同 或者 逆序排列
|
|
去掉白色外框上的数字
|
|
在图中加百分比
|
|
分面
- 在ggplot(aes()) 中不要指定group,其他正常即可。
生成饼环
|
|
去掉饼环之外的框框和中间的坐标线
|
|
饼环 - geom_rect()
|
|
折线图
geom_line():分别指定一个变量映射给x和y
x : 常规为连续变量;(显示为日期,但格式为字符串或因子,则必须转为 as_date() 格式)
若为离散型变量,需要通过factor()进行转换,此时必须使用aes(group=1)以确保知道这些数据点属于同一分组,从而应该用一条折现连在一起;
并且此时x轴的刻度值仅为因子型变量对应的分类值;若分类变量只有[1,2,4],此时x轴的刻度也仅显示[1,2,4] ,不会出现3
position = position_dodge(0.2):微调;左右移动0.2,来避免重叠
如果x变量时因子,必须同时告诉ggplot()用来分组的变量
|
|
折线图 - 多重折线图
- 在分别设定一个映射给x和y的基础上,再将另一个(离散型)变量映射给颜色(color)或者线型(linetype)
- 如果x变量时因子,必须同时告诉ggplot()用来分组的变量,否则ggplot()会不知道如何将数据组合在一起绘制折线图
- 当分组不正确时,折线图会变成锯齿状;原因在于x在每个位置都对应于多个点,ggplot()误以为这些点属于同一组数据而将其用一条折现连接
当你的折线图看起来不太合理或呈现锯齿状时,是由于分组不明确,此时必须要用
group
明确指定分组变量若当前数据无法实现,考虑转为长格式的数据结构
|
|
折线图 - 添加数据标记
- geom_point():通过点来添加标记
position = position_dodge(0.2):微调;左右移动0.2,来避免重叠
size / shape / color / fill :调整标记样式
|
|
折线图 - 线条样式
linetype、size、color
- 通过将参数传递给geom_line()设置折线图对应的属性
- 对多重折线图而言,设定图形属性会对所有折线产生影响
- 将变量映射给图形属性会使折线具由不同的外观。可用
scale_color_brewer()
和scale_color_manual()
来设定
|
|
折线图 - 实例
将数据转为长格式,然后分组作图,再分面
注意:当你的折线图看起来不太合理或呈现锯齿状时,是由于分组不明确,此时必须要用用group明确指定分组变量
|
|
日期格式的作图
- x轴转为指定的日期形式的字符串格式
通过
format
函数可以提取任意部分的日期,包括日期、星期几format(x, format=””)
|
|
- 日期格式
|
|
面积图
- geom_area():绘制面积图
- 默认情况下,面积图的填充色为黑灰色,且没有边框线;
- 若添加边框线令 color = “black” 会使得底部有一条横线,且在起点和终点的位置有一条垂直线;此时可通过不设定color,并用geom_line()绘制轨迹线
fill / color / alpha :调整样式
|
|
面积图 - 堆积
- geom_area():运行geom_area,并映射一个因子型变量给填充色(fill)即可;
- 图例翻转:brekas;默认情况下,图例的顺序与面积图的顺序是相反的;通过设定标度中的切分(breaks)参数来翻转堆积顺序
- 图形堆积翻转:在aes()内部设定order=desc(col)
size = 0.2 ;在各个区域之间添加细线
alpha = 0.4 ;将填充区域设置为半透明
|
|
- 绘制没有边框线的面积图:先绘制一个不带边框线的面积图(color=NA),然后在其顶部添加geom_line()
|
|
面积图 - 百分比堆积
- 先要计算各组对应的百分比,将该百分比列映射给y
|
|
添加置信域
- 阴影的置信域:运行geom_ribbon(),之后分别映射一个变量给 ymin 和 ymax
|
|
- 虚线的置信域:运用多个geom_line(),分别将上下边界映射给y
|
|
散点图
- geom_point():分别映射一个变量到x和y
shape = 3;设置不同的的点型
size = 2(默认); 设置点的大小
color = ;点的轮廓色
fill = ;填充色;
散点图 - 分组
- 将分组变量映射给点型(shape)和颜色(color)属性
- 分组变量必须是分类变量(即必须是因子型或字符串型的向量),可用
factor
转化后进行映射
- 分组变量必须是分类变量(即必须是因子型或字符串型的向量),可用
|
|
- 自定义分组变量的点型与颜色:
- scale_shape_manual(values=c(1,2))
- scale_color_brewer() / scale_color_manual(values=c())
当填充色为NA时,会形成一个空心的形状
散点图 - 连续型变量
当变量超过2个时,必须将它们映射到其他图形属性上,比如点的大小和颜色;
人类对于感知空间位置的微小变化很擅长,但对于图形颜色和大小的变化不敏感;因此,只有当一个变量不需要高精度的解释时,它才被适合映射给图形的大小和属性
- size= 2 ;控制大小;将某个变量映射给size属性时,最好避免将其他变量映射给shape属性;因为不同点型的点大小很难相互比较
- scale_size_continuous(range=c()):修改数据点大小的变化范围;默认情况下为1~6ms
- 当映射给大小(size)属性时,绘制的图形结果往往具有误导性;最大点对应的面积为最小点的36倍,但在数值上仅3.5倍;
- 即使修改数据点的范围,但由于点的大小与点的直径或面积是非线性的,所以这个表示值依然不精确
- color / fill :对于大多数点型,通过color属性设定颜色
- 点型21-25 除了实心区域,还有边框线,此时可通过fill来控制
- 当数据点颜色较浅时,带框线的点型就会很有用
|
|
散点图 - 图形重叠
图形的重叠度较低时
- 较小(size)的数据点
- 不会遮盖其他数据点的点形(例如1号空心圆)
图形重叠度较高时
- 使用半透明(alpha)的点
- 将数据分箱(bin),并用矩形表示(适用于量化分析)
stat_bin2d()
stat_bin2d() 函数分别在x轴和y轴方向上将数据分隔为30个组,总计900个箱子
通过scale_fill_gradient() 设定数据点的颜色,并制定最小色阶low 和最大色阶high
- 默认情况下,图例中不包括最小值,因为颜色标度的范围不是从0开始,而是以各箱中的最小非零值为起始点;若要包括零值,可调用limits参数手动这顶范围为0到最大值
- 将数据分箱(bin),并用六边形表示
hexbin::stat_binhex()
(需先安装hexbin包) - 增加随机扰动: position_jitter() 等价于 geom_point(position=”jitter”)
当散点图的其中一个或两个数据周对应离散型数据时,会出现重叠的情况
默认情况下,position_jitter() 在每个方向上添加的扰动值为数据点最小精度的40%;但可通过width 和 height 进行调整
- 使用箱线图
当数据集对应一个离散型和一个连续型数据时,箱线图时一种比较好的展示方式
|
|
散点图 - 回归拟合线
向散点图中添加线型回归拟合线
- stat_smooth():设定method=lm 即可向散点图中添加线型回归拟合线
- 若散点图进行了分组,并将分组变量映射给color和shape属性,则会分别添加拟合线
method = loess(默认);设置拟合的模型
loess曲线 : 局部加权多项式
method = glm, family=binomial :添加Logistic回归拟合线
lm ,线性回归
se = FALSE ;控制置信区间;若为会TRUE,会添加95%的置信域
level = 0.95 ;控制置信域的水平
color / linetype / size :控制拟合线的属性
为了突出直线,可设置点的 color 以使数据点不那么突出
fullrange=TRUE;默认为FALSE,支持外推的模型;正常情况下,loess()函数只能根据数据对应的x轴的范围进行预测
|
|
散点图 - 根据已有模型添加拟合线
我们需要建立自己的模型,再将模型添加到散点图上
- 无论哪种模型,只要有对应的predict() 方法,都可以用来绘制拟合线
- lm() 与 loess() 函数对应的方法分别是 predict.lm() 和 predict.losee()
|
|
散点图 - 添加多个模型的拟合线
散点图 - 添加模型系数
散点图 - 编辑地毯
边际地毯图本质上是一个一维的散点图,可被用于展示每个坐标轴上数据的分布情况
- geom_rug():添加边际地毯图
|
|
散点图 - 标签
散点图 - 气泡图
- geom_point() + scale_size_area() :通过这两者绘制气泡图
- 若直接将变量GDP映射给size属性,则GDP的值被映射给了点的半径;此时变量增加一倍时,点的面积会变为原来的4倍;这并不是我们想要的
|
|
- 其他用法:当x轴和y轴均为分类变量时,气泡图可以用来表示网格点上变量值
|
|
散点图 - 散点图矩阵
数据标签 - geom_text()
运行geom_bar() 和 geom_text() 时,需要分别指定一个变量映射给x、y和标签本身
geom_text()
- 通过设定y轴的范围,使得标签在绘图区域内;
geom_text(aes(y=Weight+0.1, label=Weight))
当标签被置于顶端上方有可能使数据标签溢出绘图区域。
- 使用标签数据时,对堆叠顺序的调整最好是通过在计算累计和之前修改因子的水平顺序
- 通过设定y轴的范围,使得标签在绘图区域内;
x ,y = colname ; 表示范围
label = colmame;显示的标签名
alpha =
color =
size = 5 (默认);
hjsut /vjust = 0(right/bottom) 和 1(left/top)
0,表示左对齐/底部对齐; 形同PPT的对象对齐;而非表格的左右对齐
1,表示又对齐/顶部对齐;
字符串(“left”,”right”,”middle”,”bottom”,”center”,”top”);
字符串 (“inward”,”outward”)
nudge_x=0 ; nudge_y=0 ;x轴方面,微调
|
|
参数与外观设置
坐标轴、图例、注解、外观、分面、配色
标度 & 主题元素一览
标度变换 - scale
- 位置标度: scale_x_discrete() / scale_x_continuous()
- 颜色标度:scale_fill_xxx() / scale_color_xxx()
- 图例标度:
主题元素函数
?theme 可获得全部的信息
- element_text()
face=”” # 字体格式
“bold” - 加粗 ;”italic” - 斜体 ;”bold.italic” - 粗斜体;”plain” - 无格式的
color =
size = num ; size = rel( n ) 当前字体的n倍
hjust /vjust = [0,1] # 对齐方式类同PPT的根据元素对齐
angle = [0,360]
lineheight = num # 行高
- element_line()
linetype = [0,6]
1- solid 实线; 2-虚线 dashed;3-点 dotted;4 - 破折号 dotdash;5 - 长破折号 longdash;6-双破折号 twodash
color =
size =
- element_rect()
linetype =
size =
color = “”
fill = “”
- element_blank()
坐标轴
theme(axis.)
- 坐标系
翻转
- coord_flip()
刻度范围 - 显示域
- coord_cartesian( xlim=c(), ylim=c())
- 坐标轴
显示名称 + 外观
- labs(x=””, y=”” )
- theme(axis.title.x = element_text(…) ) # 外观设置
刻度范围 - 定义域
xlim() / ylim()
scale_x_discrete() / scale_x_continuous()
limits = c(“”) / c(0,10)
expand_limits(x=, y=)
刻度标签 - 显示 + 外观
scale_x_discrete() / scale_x_continuous()
breaks=c(“”) / c(0,5,10)
labels=c(“”) / c() # 若设置了labels,必须同时指定breaks
theme(axis.text.x = element_text() ) # 刻度标签外观
刻度标签 - 反转
scale_x_discrete( limits=rev(levels( data$colname ))) # 离散型
scale_x_reverse() # 连续型
scale_x_reverse(limits=c(3,0)) # 反转,并设定定义域
刻度线
- theme(axis.ticks = element_blank() ) # 刻度线位置等于标签显示的位置
x / y 轴缩放比例
- coord_fix() :使得x/y轴为1:1
- 通过scale_x/y_continuous(breaks=seq(0,420,30) )
坐标轴直线
- theme(axis.line = element_line(…))
交换x轴和y轴
- coord_flip() :翻转坐标轴
坐标轴值域 - 连续型
ylim() 是 scale_y_continuous() 的简便写法,两者应避免同时出现;若要设置除值域外的其他属性,则一定要统计使用scale_y_continuous()
ggplot2中有2两种方式修改坐标轴值域
- 修改标度:任何在范围以外的数据都会被移除;即超出的数据不仅不糊被展示,而且会被完全移出处理的数据范围,并且会使图形改变
- ylim() / scale_x_discrete() / scale_x_continuous()
- 应用一个坐标变换:数据不会被修剪;它只是放大或缩小到指定的范围
- coord_cartesian(ylim=c())
|
|
坐标轴 - 项目的顺序
- 离散型变量排序的翻转:scale_x_discrete(limits=rev(levels(…)))
limits= c(“trt1”,”trt2”) ;指定显示的项目与顺序
- 连续型变量排序的翻转:scale_x_reverse()
|
|
坐标轴 - 缩放比例
x / y 的比例
- coord_fixed():得到x轴和y轴之间 1:1 的缩放结果
- 所指的1:1缩放是单位长度表示的数值范围是1:1,从而形成正方形的绘图区域
|
|
坐标轴 - 刻度线
刻度线 - 位置
- scale_x_continuous(breaks=):指定显示的刻度线
breaks=c(“4,4.25, 4.5”) :离散型
brekas=seq(0,40,10) :连续型
刻度线和标签 - 移除
对于连续型坐标轴,ggplot()会在每个breaks值的位置放置刻度线、刻度标签和主网格线;
对于离散型坐标轴,这些元素会出现在每个limits的位置
- theme(axis.text.y=element_blank()):移除标签
- theme(axis.ticks=element_blank()):移除刻度线
坐标轴 - 刻度标签
设置与修改文本
- 通过标度scale_x_discrete/continuous中的breaks和labels进行赋值
- 随ggplot2安装的scales包自带了一些内建的格式化函数:
- comma() :在千、百万、十亿等位置向数字添加逗号
- dollar():添加一个美元符号并舍入到最近接的美分
- percent():乘以100,舍入到最接近的整数值,并添加一个百分号
- scientific():对大数字和小数字给出科学计数法都表示, 如3.30e+05
|
|
坐标轴 - 刻度标签的外观
旋转、对齐、大小、颜色等
- theme(axis.text.x=element_text(angle=90, hjust=1, vjust=0.5)):旋转标签
element_text()的其他文本属性
color / size / face / family
size = rel(0.8) :表示当前字体大小的0.9倍;
坐标轴 - 坐标轴标签(名称)
坐标轴标签 - 修改
- labs(x=””, y=”” ) :修改坐标轴的标签
- xlab / ylab(“”) :修改坐标轴的标签
坐标轴标签 - 移除
- theme(axis.title.x=element_blank()):移除坐标轴标签,且不会为其留出空间
- lab(x=””) :只是将其设置为空白
坐标轴标签 - 外观
- theme(axis.title.x = element_text()):
坐标轴 - 直线
- theme(axis.line=element_line(clolor=”black”)):沿坐标轴显示直线
lineend = “square” :可将坐标轴直线边界的末端进行重叠
若最初使用的主体在绘图区域的周边就有一条线(如theme_bw()),需要同时重置参数panel.border
|
|
对数坐标轴
- scale_x_log10() / scale_y_log10() :设置对数坐标轴
|
|
- scales包中的 trans_format():刻度标签使用指数计数法
|
|
- annotation_logticks():添加刻度
坐标轴 - 日期
ggplot2可以处理两类时间对象:日期对象(类为Date的对象),日期时间对象(类为POSIXt的对象)
使用 日期格式的函数,对象必须为日各
- as.Date / as_date():注意转化为日期格式
- scale_x_date():特定的日期格式坐标轴函数(Date格式)
- scale_x_datetime():特定的时间格式坐标轴函数(POSIX格式)
- scale_x_time() :特定的时间格式的坐标轴函数(HMS格式)
breaks:
date_breaks:两者同时出现时,以date_breaks为准;
labels = 指定具体的标签内容
date_labels= “%Y/%m/%d %H:%M:S” :指定标签的格式;
- 两者同时出现时,以date_labels为准;
|
|
结合scales包完成分隔与格式
- date_breaks(width=”1 month”)
截断内容除了days,以外还可以用“auto”, “secs”, “mins”, “hours”, “weeks”等对数据进行分割显示。
- date_format(format=”%y-%m-%d”)
|
|
作图指定的坐标轴日期格式
axis.POSIXct {graphics}:Functions to plot objects of classes “POSIXlt”, “POSIXct” and “Date” representing calendar dates and times.
- axis.POSIXct(side, x, at, format, labels = TRUE, …)
axis.Date(side, x, at, format, labels = TRUE, …)
x, at:A date-time or date object.
side :See axis.
format:See strptime.
坐标轴 - 相对时间
- 方法一:手动指定跟个点和标签: scale_x_continuous(breaks=c(), labels=c())
- 方法二:自定义一个格式刷函数
图例
图例 - 概览;图例是根据aes美学来进行绘制的
theme属性是用来修改外观的
- 图例的整个控制
存在与否
- guides(fill=FALSE)
- theme(legend.position=”none”)
位置相关
- theme(legend.position=”” ) : left / right / bottom / top
- theme(legend.position=c(0, 1) ) :
- theme(legend.justification=c(0,1) ) :
整体背景
- theme(legend.background = element_rect() )
- 图例的细节部分
内部顺序
- guides( fill=guide_legend(reverse=TRUE )
- scale_fill_discrete(limits=c(“”))
标题
- labs(fill=”name”) / labs(fill=NULL)
- theme(legend.title = element_text()) / element_blank()
文本标签
- scale_fill_discrete(labels=c())
- theme(legend.text = element_text())
图例符号
- theme(legend.key = element_rect())
宽度、列数、方向等
- guides( fill = guide_legend( … ) )
keywidth = 5 ;宽度
direction = “horizontal” / “vertical”
nrow / ncol = 2 ;图例内部的行列数
图例 - 添加
同一图形中添加图例
不同图形中添加图例:
- scalexxx 需紧跟在该几何对象geom_之后
- 若希望图例的合并,则需要使用同一种标度;
|
|
图例 - 移除
- guides(…=FALSE) :指定需要移除图例的标度
- scale_fill_discrete(guide=FALSE):在对应的标度中设置为FALSE
- scale_fill_hue() / scale_fill_discrete() / scale_fill_manual() / scale_fill_grey() / scale_fill_brewer() / scalecolor… / scale_shape_manual / scale_linetype
- theme(legend.position=”none”):使用主题系统移除,会移除所有图例
|
|
图例 - 位置
- theme(legend.position=””) :选择不同的参数来放置图例的位置
top / bottom / left / right / none
- theme(legend.position=c(1,1)) :确定图例的中心放置在给定坐标轴的位置
默认为c(0.5,0.5)
- theme(legend.justification=c(1,1)) :指定图例放置在绘图区的位置
图例 - 顺序
- 反转顺序:guides(fill=guide_legend(reverse=TRUE))
- 自定义顺序:scale_fill_discrete(limits=c())将对应标度的参数limits设置为所需的顺序
|
|
图例 - 标题
标题 - 名称
- labs(fill=””) :通过labs并指定对应图例的图形属性的值
- 可同时修改不同图例对应的标题
- scale_fill_discrete(name=””) :在设定标度时设定图例标题
|
|
标题 - 外观
- theme(legend.title = element_text(…)):更改图例标题的外观
标题 - 移除
- labs(fill=NALL)
- guides(fill = guide_legend(title=NULL))
- scalefill…(guide=guide_legend(title=NULL))
图例 - 标签文本
标签 - 名称
- scale_fill_discrete(labels=c(“”)) :修改图例标签的文本
- 只修改了图例的标签,并没有修改x轴的因子水平;若修改x轴的因子水平,采用scale_x_discrete
|
|
标签 - 外观
- theme(legend.text = element_text(face=””, color=””, size=14, family=””)) :修改标签的外观
- guides(fill=guide_legend(label.theme= element_text(…)))
标签 - 多行文本
- 标度中设置 labes 参数,使用
\n
表示新行 - grid包的unit()函数指定高度:可能出现各行文本相互叠加,通过theme()增加图例说明的高度,并减少各行的间距
|
|
注解
注解 - 文本
- annotate():添加一个文类几何对象
“text”
x = , y = ; 指定添加的坐标轴位置;若坐标轴是连续型的,可以使用特殊值
Inf / -Inf
将其放置在区域的边缘label = “” ;标签文字
|
|
注解 - 数学表达式
- annotate(geom=”text”, parse=TRUE)
- 在R的数学表达式中,不能简单把一个变量直接放在另一个变量旁而不在中间加上任何记号;若要显示两个相邻的变量,需要在中间放置一个星号
*
;在显示图形时,它会被当做一个不可见的乘号对待; - 若要显示一个可见的乘号,采用
%*%
- 在R的数学表达式中,不能简单把一个变量直接放在另一个变量旁而不在中间加上任何记号;若要显示两个相邻的变量,需要在中间放置一个星号
|
|
注解 - 直线
- geom_hline() / geom_vline() :添加横线、竖线
- geom_abline() :添加有角度的直线
|
|
- 将值从数据映射到xintercept / yintercept之上,甚至是绘制另一个数据框中的值
|
|
- 当坐标轴是离散型的,必须以数字的形式指定它们
- 假设坐标轴表示一个因子,第一个水平为数值1,一次类推
|
|
注解 - 线段和箭头
- annotate(“segment”):使用segment
- grid包中arrow() 函数可向线段两端添加箭头和平头
angle=30(默认)
length=0.2 英寸(默认,0.508厘米)
|
|
注解 - 矩形阴影
- annotate(“rect”):使用rect
xmin / xmax / ymin / ymax
alpha
fill = “”
|
|
注解 - 高亮某元素
- 需在数据中创建一个新列,并将其映射为颜色;
- 若仅有少量元素要高亮,可以使用原始变量并为每个水平指定颜色,而不必创建新列
|
|
注解 - 误差线
- geom_errorbar():添加误差线,并将变量映射到 ymin 和 ymax
注解 - 向独立分面添加注解
- 使用分面变量创建一个新的数据框,并设定每个分面要绘制的值
- 配合新数据框使用geom_text()
- 若使用annotate()将在所有分面上显示
|
|
图形整体外观
标题
- labs(title=””, subtitle=””)
- theme(plot.title=element_text())
网格线
- theme(panel.grid.major = element_line() )
- theme(panel.grid.minor =element_line() )
- theme(panel.grid.major.x ) / theme(panel.grid.minor.x)
面板
- theme(panel.border = elment_rect() ) # 面板边界
- theme(panel.background = element_rect() ) # 面板背景
外观 - 图形标题
- labs(title=””):设置图形标题
- 将标题移动到绘图区内部 :使用一个文本注解annotate(),设定其x的位置为x值域的中间,y的位置为Inf;同时需要vjust为正值,使文本完全落入绘图区域
|
|
外观 - 文本
- theme(plot.title = element_text()):完成外观的设置
family :字体
face(主题元素) /fontface (文本几何对象):
color :文字颜色;颜色名称,或 “#RRGGBB”形式的十六进制颜色代码
size :字体大小;(主题元素的单位是磅,几何对象的单位是毫米)
size= rel(1.5) ,表示转为当前主题字体大小的1.5倍
hjust :横向对齐;0=左对齐;1=右对齐
0=左对齐,表示左左侧在同一垂直线;效果等同于PPT中的左对齐
vjust:纵向对齐;0=底部对齐;1=顶部对齐
0=底部对齐,表示最底端在同一水平线;效果等同PPT中的底部对齐
angle:旋转角度,单位为度
lineheight:行间距倍数
外观 - 使用主题
- theme_bw() / theme_grey() :使用主题
- theme_grey():灰色主题;默认
- theme_bw() :黑白主题
- theme_classic():白色背景,无坐标线
- theme_minimal() :无坐标线
- theme_get() :返回当前主题
- theme_set(theme_bw()):设置某个主题为当前默认主题
- theme_update() :为之后的图形设置主题
- 使用一套现有的主题,并用theme()进行微调:theme() 必须接在指定的主题语句之后;因为ggplot根据图层的先后顺序来绘制的;
|
|
主题 - 自定义
- 向一套现成主题添加元素的方式来创建自定义主题
- 将图形使用修改后的主题绘图
|
|
外观 - 面板&网格线
- panel.background:面板背景 - rect
- panel.border:面板边界 - rect
- panel.grid.major / panel.grid.minor :控制网格线 - line
- panel.grid.major.x /y :控制横向/纵向的网格线 - line
外观 - 边界
随着边界参数值增大,绘图区与边界的距离不断增大,从而在图片上留出更多空白区域
- plot.margin = : 依次控制 top/right/bottom/left
- “lines”的单位距离 小于 “cm” ;即同为1,”cm”的单位大的多
= unit(c(1,1,1,1), “lines”)
= margin(1,1,1,1, “cm”)
|
|
分面
分面方向取决于你希望进行比较的类型
- 横向分布:比较各条形的高度
- 纵向分布:比较直方图的水平分布
- facet_grid():可以指定一个变量作为纵向子面板分割的依据,指定另一个变量为横向自面板分割的依据
colname ~ colname ;
- facet_warp(~colname, nrow/nclo=n):默认使用相同数量的行和列
~ colname ;分面的分组变量
nrow / ncol = n ;
|
|
分面 - 不同坐标轴
- free_x / free_y / free:标度设置为该值
|
|
分面 - 文本标签
- 修改因子各水平的名称
|
|
分面 - 标签和标题的外观
- strip.text:控制文本的外观
- strip.background:控制背景的外
配色
R中的颜色-基本概念
R中有3种方式表示颜色
颜色名字,即上面所显示的那么多种颜色;
颜色编码。每种颜色是RGB形式的,用6位16进制的字符串表示,前面加“#”号!如红色对应的RGB值为”255 0 0”,用16进制表示就是”FF0000”,在R中可以用”#FF0000”表示红色。
调色板中的索引。
R中用palette()表示调色板,默认的是颜色是下面的几种:
>palette()
[1] “black” “red” “green3” “blue” “cyan” “magenta” “yellow”
[8] “gray”
在默认情况下,col=2表示红色。这个颜色会重复利用,如指定col=10同样是红色。
R预设了657种颜色。默认情况下,R中颜色的设置主要需要依靠grDevices包的支持,其中提供了大量的颜色选择函数以及生成函数,以及几种预先设置好的调色板(Palette),用以表现不同的主题。grDevices包中所有关于颜色的函数大致分为三类:固定颜色选择函数,颜色生成和转换函数,特定颜色主题调色板。
固定颜色选择
colors() 、 palette()
- colors()
|
|
- palette(value):调色板
- 这个函数用来设置调色板或者获得调色板颜色值;
- 注意,实际上这个函数的结果可能并非“固定”颜色,但是只要设定好了调色板,它的取值就不会再改变(直到下一次重新设定调色板)。
|
|
颜色生成与转换
RGB(红绿蓝三原色混合)、HSV(色调、饱和度、纯度)、HCL(色调、色度、亮度)、灰色
- rgb(red, green, blue, maxColorValue=1)
alpha = ;透明度;当元素图形重叠时很有用
maxColorValue =1 (默认);前三者最大的取值范围【0, maxColorValue】;通过将maxColorValue=255,可得到传统rgb颜色的16进制数值
|
|
- hsv(h, s, v, gamma=1,alpha):色调(Hue)、饱和度(Saturation)、纯度(Value)来构造颜色
h, s, v 取值 [0,1]
gamma=1 ,表示伽马校正(Gamma Correction)
|
|
- hcl(h, c, l, alpha):色调(Hue)、色度(Chroma)、亮度(Luminance)来构造颜色
h,取值[0,360];可以想象为一个角度,0-红色,120-绿色,240-蓝色;中间都是过渡色
c, l 取值[0,100],取值越大生成的颜色越亮
fixup= T/F ,表示是否修正的颜色
- grey(level):只有一个参数levle,表示灰度水平。取值[0,1];0-纯黑;1-白色
- level取一个向量,可生成一系列灰色之
- rgb2hsv() / clo2rgb()
特定颜色主题调色板
- rainbow(n, s=1, v=1, start=0, end=max(1, n-1)/n, gamma=1):彩虹的颜色(红橙黄绿青蓝紫)
n代表调色表里面有几种颜色
- heat.colors():从红色渐变到黄色再变到白色(以体现“高温”、“白热化”)
- terrain.colors() 从绿色渐变到黄色再到棕色最后到白色(这些颜色适合表示地理地形)。
- cm.colors() 从青色渐变到白色再到粉红色。
- topo.colors() 从蓝色渐变到青色再到黄色最后到棕色。
|
|
其他参数
col 绘图使用的颜色,许多函数接受一组颜色,并对不同的数据依次使用颜色。
col.axis 坐标轴字符颜色
col.lab x,y坐标标记颜色
col.main 标题颜色
col.sub 副标题颜色
fg 绘图前景色,包括坐标轴,各类boxes
bg 绘图背景色
RColorBrewer包
颜色板被划分为序列性(sequential)离散型(diverging)、分类型(qualitative)
- RColorBrewer::display.brewer.all() :调出所有的颜色示例
- display.brewer.all(type = “seq”) :序列性
- 序列型颜色板适用于从低到高排序明显的数据,浅色数字小,深色数字大。
- display.brewer.all(type = “div”):离散型
- 离散型颜色板适合带“正、负”的,对极值和中间值比较注重的数据
- display.brewer.all(type = “qual”):分类型
- 分类型颜色板比较适合区分分类型的数据
- brewer.pal(n, name):来获取该组渐变色的全部n种颜色。
|
|
离散型
hue 来自HCL色系(Hue-Chroma-Lightness;色相-色度-亮度)
- 亮度 [0,100],默认为65
填充色 | 轮廓色 | 描述 |
---|---|---|
scale_fill_discrete() | scale_color_discrete() | 色轮周围均匀等距色 |
scale_fill_hue() | scale_color_hue() | |
scale_fill_grey() | scale_color_grey() | 灰度调色板 |
scale_fill_brewer() | scale_color_brewer() | ColorBrewer调色板 |
scale_fill_manual() | scale_color_manual() | 自定义 |
|
|
- scale_xxx_grey():灰度调色板
- 标度范围[0,1] (0-黑色,1-白色)
|
|
离散型 - 自定义
- scale_xxx_manual():自定义调色板
- 当未指定时,values 向量中的元素顺序自动匹配离散标度对应因子水平的顺序。
breaks = “”
values = “”
labels = “”
|
|
- 对色盲有好的颜色
连续型
填充色 | 轮廓色 | 描述 |
---|---|---|
scale_fill_gradient() | scale_color_gradient() | 两色渐变 |
scale_fill_gradient2() | scale_color_gradient2() | 三色渐变 |
scale_fill_gradientn() | scale_color_gradientn() | 等间隔的n种颜色的渐变色 |
- scale_xxx_gradient(low=””, high=””) :连续型变量的颜色
使用两者渐变色:
low="black", high="white"
渐变色中间使用一种颜色划分 :
low=muted("red"), mid="white", higt=muted("blue")
- scales::muted() ,针对颜色输出一个饱和度较低的颜色
n个颜色的渐变色 :
scale_color_gradient(colors=c("darkded", "orange", "yellow", "white"))
根据数值设定颜色
- 根据范围创建辅助列
- 将该列映射到填充色上
|
|
上图中会发现在0水平线附近有一些凌乱的阴影。原因在于两个颜色的区域都是由各自的数据点多边形包围而成的,而这些数据点并不都在0上。
通过approx()将数据茶之道1000个点左右来解决。
123456789101112131415 > # approx()返回一个列表,包含x和y的向量> interp <- approx(cb$Year, cb$Anomaly10y, n=1000)> # 放在一个数据框中并重新计算valecne> cbi <- data.frame(Year=interp$x, Anomaly10y=interp$y)> cbi$valence[cbi$Anomaly10y >=0 ] <- "pos"> cbi$valence[cbi$Anomaly10y < 0 ] <- "neg">> # 重新作图> ggplot(cbi, aes(Year, Anomaly10y)) +> geom_area(aes(fill=valence), alpah=0.4) +> geom_line() +> geom_hline(yintercept=0) +> scale_fill_manual(values=c("#CCEEFF","#FFDDDD"), guide=FALSE) +> scale_x_continuous(expand=c(0,0)) # 剔除两边空白的部分>
>