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_continuous
和scale_y_continuous
函数进行坐标轴范围设置的时候,需要注意几个问题:
-
xlim
与ylim
两个函数实际上是scale_x_continuous
和scale_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系列函数(包括labs
、xlabs
、ylabs
)都是对scale_x_continuous
和scale_y_continuous
函数的简化写法,如果不需要设置坐标轴标签,则需要将name
参数指定为NULL
。当然也可以将其设置为""
,其区别在于是否使用空字符串进行占位显示。
1.4 坐标变换的三种写法
此处的坐标变换主要指的是指数变换、对数变换等,以便于将数据显示的更为美观。要想实现坐标变换,至少有三种方式,此处我们结合scale_x_continuous
和scale_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_log10
和scale_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