用R绘图的时候总遇到坐标轴排列顺序与自己预期的不同,并且其排列顺序总是按照字母的排列顺序进行的,这种情况下如何设置坐标轴的顺序?
首先要明白在用ggplot绘图时坐标一般分为两种数据类型,第一种用的是numeric,对应连续的坐标,用scale_x_continuous设置;另一种的character,对应离散的坐标,用scale_x_discrete设置。
rm(list = ls())
options(stringsAsFactors = F)
a=data.frame(s1=1:10,s2=1:10)
library(ggplot2)
ggplot()+geom_point(data=a,aes(x=s1,y=s2,size=s2))
如图所示我们用数字类型的数据绘图,绘制的图片中x轴为连续排列的,且labels也是默认等距离的。
这个时候可以通过scale_x_continuous改变坐标轴具体的label。常见的修改参数如下:
scale_x_continuous(expand = c(0,0), breaks = ,labels =,limits=,position=)
#expand表示x坐标轴留余,expand = c(0,0)表示去除坐标轴留余
#breaks表示坐标轴具体刻度
#labels表示坐标轴具体刻度对应的labels
#limits在连续坐标轴中表示坐标轴的范围
#position表示坐标轴的位置,如x轴为top和bottom,y轴left和right
rm(list = ls())
options(stringsAsFactors = F)
a=data.frame(s1=1:10,s2=1:10)
library(ggplot2)
ggplot()+geom_point(data=a,aes(x=s1,y=s2,size=s2))+
scale_x_continuous(breaks=1:10,labels=1:10)
通过breaks设置具体刻度,结果如下
可以通过scale_x_reverse()改变坐标轴排列方向
ggplot()+geom_point(data=a,aes(x=s1,y=s2,size=s2))+
#scale_x_continuous(breaks=1:10,labels = 1:10)+
scale_x_reverse()
但就是改变不了坐标轴顺序,比如1,2,3,5,4排列,这是不行的,因为x轴是连续的数值型数据,无法改变数值的排列先后。
这时候就需要离散型坐标,离散型坐标一般为字符形式,可以用as.character()把数值型转换为字符型。
rm(list = ls())
options(stringsAsFactors = F)
a=data.frame(s1=1:10,s2=1:10)
library(ggplot2)
a$s1=as.character(a$s1) #数值型转换为字符型
ggplot()+geom_point(data=a,aes(x=s1,y=s2,size=s2))
这个时候的x轴就是离散型坐标轴,可以看到10因为第一位是1所以排在第二位,明显是字符的排列顺序。
我们可以通过scale_x_discrete中的limits对离散型坐标轴随意设置坐标轴先后。
rm(list = ls())
options(stringsAsFactors = F)
a=data.frame(s1=1:10,s2=1:10)
library(ggplot2)
a$s1=as.character(a$s1)
ggplot()+geom_point(data=a,aes(x=s1,y=s2,size=s2))+
scale_x_discrete(limits=as.character(c(1,4,3,10,5,2,7,9,8,6)))
可以看到确实实现了
还是一种方法是通过转换为factor设置level来实现,相当于提前排序。
rm(list = ls())
options(stringsAsFactors = F)
a=data.frame(s1=1:10,s2=1:10)
library(ggplot2)
a$s1=as.character(a$s1)
a$s1=factor(a$s1,levels =c(1,4,3,10,5,2,7,9,8,6) ) #factor设置level来设置先后顺序
ggplot()+geom_point(data=a,aes(x=s1,y=s2,size=s2))