axis tick marks和legend tick marks是scale breaks的特殊案例,通过scale函数的
breaks
参数设置。
每个break对应一条major gridline,两个主要网格线之间有一条minor gridline,对应minor breaks。
breaks
参数用来设置主要刻度标签的位置,
minor_breaks
参数用来设置次要刻度标签的位置。
breaks=NULL
:无主要刻度标签,并删除对应的网格线
breaks=由transformation object计算的默认breaks
:默认
trans=identity
,坐标轴就是一个数轴。我理解的是就像地图中的比例尺一样,"真实"的数值与ggplot坐标轴上的数值存在一个倍数直线线性关系。
breaks=手动设置的向量
;这种情况最容易理解和操作,你可以在数轴上任意标注breaks
breaks=函数
:提供的函数需要能接受一个二值向量(即limits的范围),最后返回breaks,
scales
包提供了几个有用的工具:
scales::breaks_extended(n=5,...)
:用Wilkinson's extended breaks algorithm进行break
scales::breaks_log(n=5,base=10)
:以
limits=c(1,100000),n=5,base=10
为例,大概计算过程为:step1)
raw_rng=range(limits)
;step2)
rng <- log(raw_rng, base = base)
;step3)
max<-ceiling(rng[2]);min<-floor(rng[1]);by <- floor(max - min)/n) + 1
;step4)
breaks <- base^seq(min, max, by = by)
,最终呈现的效果是坐标轴上有多个视觉上等间隔的breaks,但对应的不是等步长的值。
scales::breaks_width(width,offset=0)
:在numeric、date、date-time scales上都很有用;
width
为每个break之间的距离,
offset
为偏移量,也可以是一个向量。
scales::breaks_pretty(n=5,...)
:用
pretty()
算法,原生对date/times有用。
注意:以上这些函数,设置的
n
与最终得到的breaks的数目不一定完全一致。
次要刻度标签的位置对log scales很有用,因为它提示scale是非线性的。同
breaks
一样,
minor_breaks
可以设置为:
minor_breaks=NULL
:删除次要刻度标签
minor_breaks=默认
:两个主要刻度之间有一个次要刻度
minor_breaks=手动设置的向量
minor_breaks=函数
:例如:
scales::minor_breaks_n(n)
、
scales::minor_breaks_width(width, offset)
[小坑,测试不通过]
每个break与一个label关联,可以通过
labels
参数修改labels,所以
breaks
和
labels
参数对应的向量长度应保持一致。
scales
包也提供了一系列函数来格式化labels。包括:
scales::label_bytes()
、
scales::label_comma()
、
scales::label_dollar()
、
scales::label_ordinal()
、
scales::label_percent()
、
scales::label_pvalue()
。从这些函数的名字就可以看出其基本功能,使用的时候直接查看函数帮助即可,非常方便。
三者之间的关系
minor_breaks
和
labels
都依赖
breaks
,三者设置为
NULL
时的区别是:
breaks=NULL
会删除主要刻度、次要刻度以及labels,其他两者则只会删除对应属性。
df <- data.frame(a=1:5,b=c(1,10,100,1000,10000))
p<-ggplot(df,aes(a,b)) + geom_point()