ggplot2学习(二)

ggplot2基础(2)——坐标轴

ggplot2基础(1)
ggplot2基础(2)——坐标轴
ggplot2基础(3)——注释
ggplot2基础(4)——主题
ggplot2基础(5)——配色与图例

众所周知,使用ggplot画出图片并不难,难的是对细节的把握,即当需要对某些细节进行调整时,往往需要花费大量的精力,因此接下来的几篇文章,我会结合自己的学习,介绍一些对图片细节的调整

参考《R语言实战》、《R数据可视化手册》、《R语言可视化———— ggplot 坐标系》《R|ggplot2(三)|coord 系列函数坐标轴转换》

ggplot2对于坐标轴的操作主要有以下几个函数:

  • scale_x_continuous
  • scale_y_continuous
  • scale_x_discrete
  • scale_y_discrete
  • scale_x_log10
  • scale_y_log10
  • coord_flip
  • ylim
  • xlim
  • ylabs
  • xlabs
  • labs
  • expand_limits
  • coord_fixed

此外还有坐标系的选择等一系列函数:

  • 极坐标 coord_polar
  • 对数坐标
  • 笛卡尔坐标系 coord_cartesian
  • 变换笛卡尔坐标系 coord_trans

1 scale_x_continuous、scale_y_continuous

scale_x_continous/scale_y_continous函数的定义如下:

scale_x_continuous(
    name = , #坐标轴标签
    breaks = , #定义刻度线
    minor_breaks = ,
    labels = , #刻度标签
    limits = , # 设置值域范围
    expand = c(0.05,0), 
    #坐标轴延伸,确保图形元素不覆盖坐标
    oob = censor,#识别越过边界的点
    na.value = NA_real_,
    trans = 'identity', #数据变换
    position = 'bottom', #left/right/top
    sec.axis = #定义第二坐标轴
)

通过这个函数,可以实现以下功能:

1.1 设置坐标轴的值域范围 —— limits

通过指定limits参数,可是设置坐标轴的显示范围,在不进行limits参数设置时,其图像为:

library(ggplot2)

ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot()
image.png

如果指定了limits参数,则可以看到图片的y轴范围发生了明显的变化:

ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_y_continuous(limits=c(0, 10))
image.png

当使用scale_x_continuousscale_y_continuous函数进行坐标轴范围设置的时候,需要注意几个问题:

  • xlimylim两个函数实际上是scale_x_continuousscale_y_continuous函数的简化写法
  • 如果设置的范围小于实际的数据范围,则会对数据进行一定的剪除(系统会给出相应的警告),如果要避免数据剪除的问题,则应使用coord_cartesian函数,具体的代码如下:
# install.packages("cowplot")
library(cowplot)
p0 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot()

p1 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_y_continuous(limits=c(5, 6.5))

p2 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    coord_cartesian(ylim=c(5, 6.5))

plot_grid(p0, p1, p2, labels = LETTERS[1:3])

警告信息提示有13行的数据没有显示:

Warning message:
"Removed 13 rows containing non-finite values (stat_boxplot)."
image.png

1.2 设置刻度线——breaks&labels

要想对图中的刻度线进行设置,需要调整breaks参数和labels,例如:

library(cowplot)

p1 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8))

p2 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8), labels=c("label1", "label2", "label3", "label4", "label5", "label6"))

p3 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_y_continuous(NULL)

plot_grid(p1, p2, p3, labels = LETTERS[1:3])
image.png

1.3 设置坐标轴标签——names参数与labs函数

设置坐标轴的标签比较简单,只需要设置names参数即可,此外与limits参数类似,labs系列函数(包括labsxlabsylabs)都是对scale_x_continuousscale_y_continuous函数的简化写法,如果不需要设置坐标轴标签,则需要将name参数指定为NULL。当然也可以将其设置为"",其区别在于是否使用空字符串进行占位显示。

1.4 坐标变换的三种写法

此处的坐标变换主要指的是指数变换、对数变换等,以便于将数据显示的更为美观。要想实现坐标变换,至少有三种方式,此处我们结合scale_x_continuousscale_y_continuous来做介绍。

1.4.1 基于trans参数

trans可使用的参数包括"log2""log10""sqrt"等,如果结合scale包,则可以实现更多变换

trans可使用的参数列表:"asn", "atanh", "boxcox",
"date", "exp", "hms",
"identity", "log", "log10",
"log1p", "log2", "logit",
"modulus", "probability", "probit",
"pseudo_log", "reciprocal", "reverse",
"sqrt" "time"

library(MASS)

p1 <- ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
    geom_text(size=3)

p2 <- ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
    geom_text(size=3) +
    scale_x_continuous(trans="log10", breaks=10^(-1:5)) +
    scale_y_continuous(trans="log10")

plot_grid(p1, p2, labels = LETTERS[1:2], nrow=2)
image.png

1.4.2 基于scale_x_log10scale_y_log10等函数

相对而言,这种写法最为死板。其具体代码为:

ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
    geom_text(size=3) +
    scale_x_log10(breaks=10^(-1:5)) +
    scale_y_log10()
image.png

1.4.3 基于coord_trans函数

coord_trans函数的定义为:

coord_trans(
  x = "identity",
  y = "identity",
  xlim = NULL,
  ylim = NULL,
  limx = "DEPRECATED",
  limy = "DEPRECATED",
  clip = "on",
  expand = TRUE
)

可以看到coord_trans函数的参数与我们之前介绍的非常类似,常规的变换需要在x和y处进行设置,其内容可以参考1.4.1部分的内容。

ggplot(Animals, aes(x=body, y=brain, label=rownames(Animals))) +
    geom_text(size=3) +
    coord_trans("log10", "log10")

从上图中可以看到,尽管coord_trans与scale_x_log10函数的效果是一样的,但是还是有一些细微的差别,scale系列函数是先将数据取对数,再用转换后的数据进行处理(比如拟合),而coord_trans函数则是先进行处理,然后再进行绘图,下图给出了一个明显的例子。可以看出图A中是先进行了变换,然后才进行的拟合操作,因此绘制出的图像是一条直线;而图B中是先进行了拟合,然后才绘图,所以得到的是一条曲线。

d <- subset(diamonds, carat > 0.5)

p1 <- ggplot(d, aes(carat, price)) +
  geom_point() +
  geom_smooth(method = "lm") +
  scale_x_log10() +
  scale_y_log10()

p2 <- ggplot(d, aes(carat, price)) +
  geom_point() +
  geom_smooth(method = "lm") +
  coord_trans(x = "log10", y = "log10")

plot_grid(p1, p2, labels = LETTERS[1:2], nrow = 2)
image.png

2 scale_x_discrete、scale_y_discrete

离散型的scale_x与scale_y与连续型的非常相似,此处就不做过多的介绍了,这里只介绍一点点小小的差别。

要想调整离散型坐标的顺序,需要指定limits参数,即:

p1 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_x_discrete(limits=c("trt1", "ctrl", "trt2")) + coord_fixed(ratio = 1)

p2 <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot() +
    scale_x_discrete(limits=rev(levels(PlantGrowth$group)))+ coord_fixed(ratio = 1)

plot_grid(p1, p2, labels = LETTERS[1:2], nrow = 2) 
image.png

3 coord_fixed

coord_fixed函数的定义为:

coord_fixed(ratio = 1, xlim = NULL, ylim = NULL, expand = TRUE, clip = "on")

该函数主要用于调整纵横坐标的比例,默认为1:1,如果需要调整则可直接指定,例如:

ggplot(mtcars, aes(wt, drat)) + 
    geom_point()
image.png
ggplot(mtcars, aes(wt, drat)) + 
    geom_point() +
    coord_fixed(ratio=1/2)
image.png

4 极坐标

本质上而言,ggplot2中的极坐标,是将图片的某一个轴映射为角度信息,因此极坐标的函数定义为:

coord_polar(theta = "x", start = 0, direction = 1, clip = "on")

其中,theta表示的是转换为角度的坐标轴,默认为x轴,例如在绘制饼图的时候,可以使用如下代码:

p1 <- ggplot(mtcars, aes(x = factor(1), fill = factor(cyl))) +
  geom_bar()

p2 <- p1 + 
    coord_polar(theta="y")

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

推荐阅读更多精彩内容