R语⾔ggplot2包之坐标轴详解
引⾔
我们还可以对图形中的坐标轴进⾏处理,包括x、y轴对换、设定坐标轴范围、刻度线修改与去除等等。要想对图形玩得转,坐标轴处理精通不可或缺。
坐标轴对换
我们使⽤coord_flip()函数来对换坐标轴。
library(ggplot2)
library(gcookbook)
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot()
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + coord_flip()
置换x、y轴时有时候会导致某⼀坐标轴的坐标被逆转。⽐如说原x轴的数据是从左往右阅读的,在对换后,原来数据会从下往上给呈现。有时这是个问题。如果x是因⼦,我们可以对其⽤带参数limits=rev(levels(…))的函数scale_x_discrete()进⾏修正。
如果是连续变量,我们可以使⽤函数scale_y_reverse 或者scale_x_reverse来逆转坐标轴。
merge函数
如果我们想改变分类变量的显⽰顺序,可以设置scale_x_discrete() or scale_y_discrete()函数就⾏。
#因⼦坐标轴
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + coord_flip() +
scale_x_discrete(limits=rev(levels(PlantGrowth$group)))
#连续变量的逆转
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() + scale_y_reverse()
#改变分类变量顺序
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot()+scale_x_discrete(limits=c("trt1","ctrl","trt2"))
设置x,y轴的连续变量范围
我们可以使⽤xlim()和ylim设置x、y轴的最⼤最⼩值。
p <- ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot()
p + ylim(0, max(PlantGrowth$weight))
#ylim()是对scale_y_continuous()的快速实现。
#其中breaks⽤来控制刻度。
p + scale_y_continuous(limits=c(0, 10), breaks=NULL)
设置x、y轴刻度相对⽐例
我们可以设置x、y轴刻度的相对⽐例,可以是1:1,即⼀致的长度。也可以让其中⼀个轴的刻度变得更长⼀些,或者说两个刻度线之间的距离更⼤⼀些。
sp <- ggplot(marathon, aes(x=Half,y=Full)) + geom_point()
#1:1
sp + coord_fixed() +
scale_y_continuous(breaks=seq(0, 420, 30)) +
scale_x_continuous(breaks=seq(0, 420, 30))
#1:2 x轴刻度长度⽐y轴刻度长度
sp + coord_fixed(ratio=1/2) +
scale_y_continuous(breaks=seq(0, 420, 30)) +
scale_x_continuous(breaks=seq(0, 420, 15))
设置刻度线的位置
ggplot()函数对处理刻度线位置⾮常擅长,只要改变刻度的间隔即可(这⾥的刻度线指的是⼤刻度线)。如果坐标轴上变量是连续变量,则不会出现⼩刻度线。
#连续变量
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() +
scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6, 8))
#看到没有,刻度线位置已经按照breaks设置的参数改变了
#如果是离散变量,则使⽤scale_x_discrete函数
#通过limit函数来控制标签的个数和顺序
ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot() +
scale_x_discrete(limits=c("trt2", "ctrl"))
去除刻度线、刻度标签和⽹格线
如果想去除刻度标签,我们使⽤ = element_blank())(如果针对x,参数y改成x即可。
如果想去除刻度线,在theme函数中使⽤axis.ticks.y = element_blank(),如果x、y轴都想去除axis.ticks.y改成axis.ticks即可。有时候⽹格线让整个图画显得复杂,我们也可以对此进⾏去除。breaks
的参数值设为NULL就⾏了。
p <- ggplot(PlantGrowth, aes(x=group, y=weight)) + geom_boxplot()
#去除刻度标签
p + = element_blank())
#去除刻度线
p + theme(axis.ticks.y = element_blank(), = element_blank())
#去除⽹格线
p + scale_y_continuous(breaks=NULL)