ggplot2定制坐标轴

本文主要介绍如何通过调整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))
修改了刻度标签的颜色,并逆时针旋转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")
从左往右依次为p1 p2 p3

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

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

推荐阅读更多精彩内容