ggplot_scale.md 4.3 KB

标尺

标尺(scale)也叫尺度。是把数据映射到显示设备的变换。数学上叫做尺度变换。物质的本质是变异,变异的基础是它的参照。使用不同的参照会得到不同的数值。尺度变换可能是线性的也可能是非线性的,如对数变换,y=log10(x)。 数据值与物理的绘图单元之间的变换就需要尺度变换。如把1:10序列绘制在一张纸上,要把纸上的一条线段分成10个等分,每个等分对应数值1,或者首先绘制一个10厘米的线段,每厘米线端代表1。这种映射函数就是尺度变换。同样绘制1到10这个数列,不同大小的纸张上面绘制不同大小的图时选用的尺度不同。这只是一个简单的例子,但能够说明什么是尺度。

ggplot中标尺控制数据向视觉属性的转换。标尺不仅包括尺度变换算的逻辑(trans),还包括其显示的属性,如标签、刻度、上限、下限、位置等。

坐标轴轴标尺(scalex, scaley)

scale_x_continuous(name = waiver(), breaks = waiver(),
  minor_breaks = waiver(), labels = waiver(), limits = NULL,
  expand = waiver(), oob = censor, na.value = NA_real_,
  trans = "identity", position = "bottom", sec.axis = waiver())

scale_y_continuous(name = waiver(), breaks = waiver(),
  minor_breaks = waiver(), labels = waiver(), limits = NULL,
  expand = waiver(), oob = censor, na.value = NA_real_,
  trans = "identity", position = "left", sec.axis = waiver())

scale_x_log10(...)

scale_y_log10(...)

scale_x_reverse(...)

scale_y_reverse(...)

scale_x_sqrt(...)

scale_y_sqrt(...)

参数:

  • name: 标尺名称,用作坐标轴和图例标题。如果取值为NULL,标尺名取自第一个视觉属性映射。默认值为NULL。
  • breaks: 刻度,或称ticks,可能的取值是

    • NULL: 无breaks

    • waiver(): 默认值,由变换的输入对象(也就是变量)计算得到。

    • 一个位置向量

    • 一个函数,用极限作为输入,输出breaks。

  • minor_breaks: 最小的刻度值

可能的取值与breaks相同。

  • labels: 标签

取值为:

- NULL 没有标签

- waiver() 默认取自变换对象的计算结果

- 字符串向量,用于手动指定标签,其长度必须与刻度数相同。

- 一个用刻度作为输入输出标签的函数。
  • limits: 上下限,两个元素的数值向量,分别表示标尺的下限和上限。用NA显示数值的实际上下限。
  • expand: 标尺的扩展,用于扩展标尺的显示范围,比如你向把图表的位置向上或向右移,让他不要太靠近坐标轴,就可以设置expand扩展标尺。expand取值为一个两元素的数值向量。对于连续型变量,默认为c(0.05,0),即曲线会右移0.05个刻度的距离,而y轴方向不变。对于离散型变量,默认值为c(0, 0.6),即上0.6个刻度的距离。
  • oob: 处理出界limits的函数。默认用NA取代。
  • na.value: 缺失值将被这个值取代。
  • trans: 尺度变换名称.内置的变换有,"asn", "atanh", "boxcox", "exp", "identity", "log", "log10", "log1p", "log2", "logit", "probability", "probit", "reciprocal", "reverse" and "sqrt".
  • position: 坐标轴位置。纵坐标取值为"left"或"right",横坐标取值为"top"或"bottom"。
  • sec.axis: 指定第二个坐标轴,即双坐标轴
  • ...: 其他参数。

例子

使用默认值。

p1 <- ggplot(mpg, aes(displ, hwy)) +
  geom_point()

自定义坐标轴标签:

p1 +
  scale_x_continuous("Engine displacement (L)") +
  scale_y_continuous("Highway MPG")

用NULL去掉坐标轴标签

p1 + labs(x = NULL, y = NULL)

修改坐标轴上下限

p1 + scale_x_continuous(limits = c(2, 6))

或者使用简便的方式

p1 + xlim(2, 6)

选择要显示的刻度

p1 + scale_x_continuous(breaks = c(2, 4, 6))

添加这些刻度对应的标签

p1 + scale_x_continuous(
  breaks = c(2, 4, 6),
  label = c("二", "四", "六")
)

标签格式化

df <- data.frame(
  x = rnorm(10) * 100000,
  y = seq(0, 1, length.out = 10)
)
p2 <- ggplot(df, aes(x, y)) + geom_point()
p2 + scale_y_continuous(labels = scales::percent)

y轴标签显示%.

在scales包中,常用的还有scales::dollar,scales::comma

坐标变换

p1 + scale_y_log10()
p1 + scale_y_sqrt()
p1 + scale_y_reverse()

最后一个按x轴反转.