限度
一个标度的限度(limits)或值域通常来源于数据的范围。有两个理由去指定限度而不是依赖于数据
- 想让限度的范围比数据的范围更小,从而集中于图形的有趣的部分
- 想让限度的范围比数据的范围更大,因为想用多个图来相配
很自然地,可以想到位置标度地局限性:它们直接映射到坐标轴上。但是限度也可应用到有图例的标度上,像颜色、尺寸和形状。如果想要颜色于文章中的多个图相配,则限度时特别重要的
可以使用标度的limits参数来修改限度
- 对于连续标度,limits参数需要长度为2的数值向量。如果仅仅想设置上限或下限值,可以将另一个值设为NA
- 对于离散标度,limits是一个枚举所有可能指的字符串向量
df <- data.frame(x = 1:3, y = 1:3)
base <- ggplot(df, aes(x, y)) + geom_point()
base
base + scale_x_continuous(limits = c(1.5, 2.5))
base + scale_x_continuous(limits = c(0, 4))
因为更改限度是一个很常见的工作,ggplot2提供了简化此工作的辅助函数:xlim()、ylim()、lims()。这些函数检查它们的输入,然后创建相应的标度,如下所示
xlim(10, 20): 从10到20的连续标度
ylim(20, 10): 从20到10的反向连续标度
xlim(“a”, “b”, “c”): 离散标度
xlim(as.Date(c(“2008-05-01”, “2008-08-01”))): 从2008年5月1日至2008年8月1日的日期标度
base + xlim(0, 4)
base + xlim(4, 0)
base + lims(x = c(0, 4))
坐标轴的范围实际上比指定的要延长一点,这保证了数据不会覆盖坐标轴。设置expand = c(0, 0)可以释放此空间。这和geom_rastre()联合使用的时候很有用
ggplot(faithfuld, aes(waiting, eruptions)) +
geom_raster(aes(fill = density)) +
theme(legend.position = "none")
ggplot(faithfuld, aes(waiting, eruptions)) +
geom_raster(aes(fill = density)) +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0)) +
theme(legend.position = "none")
默认情况下,在限度外面的任意数据会被转化为NA,这意味着设置限度与把图像放大到某一区域是不同的。为了得到相同的效果,需要使用coord_cartesian()函数的xlim和ylim参数。这个是纯放大视觉的,并且不影响基础数据。可以用oob(out of bound,“超越边界”)参数来修改标度。默认的是scales::censor(),它用NA代替任意超越限度的值。另一个选项是scales::squish(),它将所有数据压缩到区间内
df <- data.frame(x = 1:5)
p <- ggplot(df, aes(x, 1)) +
geom_tile(aes(fill = x), color = "white")
p
p + scale_fill_gradient(limits = c(2, 4))
p + scale_fill_gradient(limits = c(2, 4), oob = scales::squish)