10. ggplot2坐标轴刻度位置(breaks)和标签(labels)的设置

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()