本文主要介绍如何通过调整ggplot2中的参数,来实现坐标轴的定制化,来达到个性化绘图的需求。文中axis tick marks指的是坐标轴线上的刻度,axis labels指的是对应刻度上的标签。而xlab和ylab函数用于设置坐标轴的标签,不是刻度标签,要注意区分,当然也可以使用labs函数进行设置。
1. 用于演示的数据
R软件本身包含一些基础包,并且在R启动的时候自动导入,例如包含内置数据集合的datasets包(可以输入library(help = "datasets")查看包中的所有数据集。),本次我们使用“不用剂量的VC,使用两种递送方式对豚鼠牙齿成长作用”的数据集,包含三列分别使len(牙齿长度)、supp(递送方式)和dose(剂量)。
#使用ToothGrowth数据集,并将dose列转换为因子类型,通过head查看数据的前几行
>ToothGrowth$dose <- as.factor(ToothGrowth$dose)
>head(ToothGrowth)
len supp dose
1 4.2 VC 0.5
2 11.5 VC 0.5
3 7.3 VC 0.5
4 5.8 VC 0.5
5 6.4 VC 0.5
6 10.0 VC 0.5
2. 示例图形
使用最少的绘图参数绘制不同剂量下豚鼠牙齿长度的箱线图,评估VC剂量对其是否存在影响。
>library(ggplot2)
>p <- ggplot(ToothGrowth, aes(x=dose, y=len)) + geom_boxplot()
>p
3. 修改坐标轴刻度标签
坐标轴刻度标签可以通过设置theme函数中的axis.text*参数进行设置,这些参数对应的数据类型为element_text()类型,所以只需要修改element_text()中的参数后再赋值给对应axis.text参数即可。
通过查看函数帮助文档可以发现有axis.text, axis.text.x, axis.text.x.top, axis.text.x.bottom, axis.text.y, axis.text.y.left, axis.text.y.right多个参数,他们分别控制不同的范围,axis.text设置所有坐标轴刻度标签外观,axis.text.y.right用于设置y轴右侧刻度标签外观。
# element_text()函数中相关参数说明
family : 设置字体类型
face : 修改字体形态,例如加粗、斜体等
colour : 文本的颜色
size : 以像素设置字体的大小
angle : 文本逆时针旋转角度[0-360]
>p + theme(axis.text.x = element_text(face="bold", color="#993333", size=14, angle=45),
axis.text.y = element_text(face="bold", color="#993333", size=14, angle=45))
4. 隐藏坐标轴刻度标签
当我们将axis.text*设置为element_blank()时,刻度标签将不再显示,除了坐标轴刻度标签,坐标轴上面还有坐标轴刻度axis_ticks、坐标轴主线axis_line,这两个参数对应的类型为element_line(),当然如果将axis_ticks设置为element_blank()时,刻度将不再展示。
#x/y轴的刻度标签设置为空
p + theme( axis.text.x = element_blank(),axis.text.y = element_blank())
#x/y轴的刻度标签设置为空,并且坐标轴刻度不再显示(设为空)
p + theme( axis.text.x = element_blank(),axis.text.y = element_blank(),axis.ticks = element_blank())
5. 修改坐标轴主线和刻度外观
theme函数用于设置图形主题,其中axis.ticks*参数家族用于设置坐标轴刻度外观,axis.line*用于这只坐标轴主线外观,它俩的参数类型都是element_line()类型。
#函数element_line()中用于设置线条外观的参数和说明
colour,color: 线条的颜色
size: 线条的大小,即粗细
linetype: 线条的类型可以实文本“blank”, “solid”, “dashed”, “dotted”, “dotdash”, “longdash”, “twodash”,也可以是数字0, 1, 2, 3, 4, 5, 6.
更多可以参考:http://www.sthda.com/english/wiki/ggplot2-line-types-how-to-change-line-types-of-a-graph-in-r-software
lineend: 线条末端类型 round(圆形弧度), butt(末端粗大)、(末端方形)
>p + theme( axis.line = element_line(colour = "darkblue", size = 1, linetype = "solid"))
6. 设置连续、离散坐标轴的刻度
图形中x、y轴都可以是离散或者连续的,我们可以使用scale_x_discrete() 和scale_y_discrete()分别设置坐标轴刻度的位置、刻度标签和范围等。
6.1 离散坐标轴
函数scale_x_discrete()和scale_y_discrete()分别用于设置x、y的坐标轴,可以完成对以下坐标轴外观的修改,还可以通过limits调整绘图顺序。
- axis titles,刻度标签
- axis limits (data range to display),刻度显示范围
- choose where tick marks appear,选择要显示的刻度
- manually label tick marks,手动添加/修改刻度标签
#对应的参数如下:
name : x or y axis labels,刻度标签
breaks : 设置刻度显示的位置. 可以是三种类型的值:
NULL : 表示不显示刻度
breaks waiver() : 使用包内置的方式计算显示刻度位置
字符串或数值的向量,指定刻度所在的位置
labels : 设置刻度上的标签,向量时与breaks对应的标签名称,NULL不设标签,waiver() 默认标签
limits : 离散坐标轴时,试一个字符串类型的向量,指定要显示位置信息
#默认图形
>p
# 修改x轴的标题,并通过limits参数设置数据的绘图顺序
>p + scale_x_discrete(name ="Dose (mg)", limits=c("2","1","0.5"))
通过breaks和labels配合的方式,或单独使用labels修改指定坐标轴刻度上的标签。
#breaks和labels长度相同,即在breaks指定位置添加标签
>p + scale_x_discrete(breaks=c("0.5","1","2"),labels=c("Dose 0.5", "Dose 1", "Dose 2"))
# 单独使用labels,等号左边是位置,右边是标签内容
>p + scale_x_discrete(labels=c("0.5" = "Dose 0.5", "1" = "Dose 1", "2" = "Dose 2"))
其中breaks和labels一起使用可以设置是否在给定位置添加、修改标签,而limits参数不仅可以用于设置绘图顺序,还可以筛选数据,还需要注意的是limits中的参数必须在数据集中存在。
>p1<-p + scale_x_discrete(breaks=c("0.5", "2"),labels=c("Dose 0.5", "Dose 2"))
>p2<-p + scale_x_discrete(limits=c("0.5", "2"))
>p3<-p + xlim("0.5", "2")
6.2 连续坐标轴
当x、y轴的数据是连续时,可以使用scale_x_continuous()、scale_y_continuous() 函数对连续坐标轴的外观进行设置。这两个函数可以完成对轴标签、绘图范围和轴刻度标签等的修改。
下面以datasets中的cars数据集进行展示,里面包含两列分别是汽车速度(speed)和对应的刹车距离(dist)信息。
#两个函数中相关参数的说明
name : x、y轴的标签
breaks : 设置添加刻度和刻度标签的位置,参数可以是三种类型:
NULL : 不绘制任何刻度和标签
waiver() : 使用默认的方式添加刻度和标签
字符串或数值的向量,来指定添加刻度和标签的位置
labels : 坐标轴刻度标签的内容,参数可以是三种类型:
NULL:不绘制任何刻度和标签
waiver() :使用默认的方式添加刻度和标签
字符串或数值的向量,来指定添加刻度标签的内容
limits : 数值类型的向量,设置x、y轴的范围 (min, max)
trans:添加坐标轴的转换方式, 可以是 “log2”, “log10”, “sqrt”, 等
>sp<-ggplot(cars, aes(x = speed, y = dist)) + geom_point()
>sp + scale_x_continuous(name="Speed of cars", limits=c(0, 30))+scale_y_continuous(name="Stopping distance", limits=c(0, 150))
下面代码展示了如何使用scale_y_continuous()函数设置y轴上的刻度和刻度标签的位置。
>p + scale_y_continuous(breaks=seq(0,40,5))
>p + scale_y_continuous(breaks=c(5,7.5, 20, 25))
>p + scale_y_continuous(breaks=NULL)
格式化设置刻度标签内容,这里需要用到额外的scales包。
library(scales)
# 设置刻度标签为百分比
p + scale_y_continuous(labels = percent)
# 设置刻度标签为科学计数法
p + scale_y_continuous(labels = scientific)
参考链接:http://www.sthda.com/english/wiki/ggplot2-axis-ticks-a-guide-to-customize-tick-marks-and-labels