我的数据可视化学习之旅

ggplot2学习(二)

2022-02-17  本文已影响0人  韧心222

ggplot2基础(2)——坐标轴

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

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

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

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

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

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函数进行坐标轴范围设置的时候,需要注意几个问题:

# 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
上一篇下一篇

猜你喜欢

热点阅读