标度
所有的标度构建器(scale constructor)都拥有一套通用的命名方案。它们以scale_开头,接下来是图形属性的名称(例如,colour_、shape_ 或 x_),最后以标度的名称结尾(例如,gradient、hue 或 manual)。
表6.1 按图形属性和变量类型排列的各种标度
图形属性 | 离散型 | 连续型 |
---|---|---|
颜色(colour)和填充色(fill) | brewer | gradient |
grey | gradient2 | |
hue | gradientn | |
identity | ||
manual | ||
位置(postion)(x,y) | discrete | continous |
date | ||
形状(shape) | shape | |
identity | ||
manual | ||
线条类型(line type) | linetype | |
identity | ||
manual | ||
大小(size) | identity | size |
manual |
p <- qplot(sleep_total,sleep_cycle,data = msleep,colour=vore)
p
##显式添加默认标度
p+scale_colour_hue()
##修改默认标度的参数,这里改变了图例的外观
p+scale_colour_hue("What does\nit eat?",
breaks = c("herbi","carni","omni",NA),
labels = c("plants","meat","both","don't know"))
##使用一种不同的标度
p+scale_colour_brewer(palette = "Set1")
通用参数
- name: 设置坐标轴或图例上出现的标签。由于经常需要微调这些标签,所以使用三个辅组函数xlab(),ylab()和labs()。
p1 <- qplot(cty,hwy,data = mpg,colour = displ)
p1
p2 <- p1 + scale_x_continuous("City mpg")
p2
p3 <- p1 + xlab("City mpg")
p4 <- p1 + ylab("Highway mpg")
p5 <- p1 + labs(x = "City mpg",y = "Highway mpg",colour = "Displacement")
p6 <- p1 + xlab(expression(frac(miles,gallon)))
- limits: 固定标度的定义域。
- breaks和labels:breaks 控制着显示在坐标轴或图例上的值,即,坐标轴上应该显示哪些刻度线的值,或一个连续型标度在一个图例中将被如何分段。labels指定了应在断点处显示的标签。
p1 <- qplot(cyl,wt,data = mtcars)
p1
p2 <- p1 + scale_x_continuous(breaks = c(5.5,6.5))
p3 <- p1 + scale_x_continuous(limits = c(5.5,6.5))
p2
p3
p4 <- qplot(wt,cyl,data = mtcars,colour = cyl)
p4
p5 <- p4 + scale_colour_gradient(breaks = c(5.5,6.5))
p5
p6 <- p4 + scale_colour_gradient(limits=c(5.5,6.5))
p6
- formatter: 如果未指定任何标签,则将在每个断点处自动调用格式刷(formatter)来格式化生成标签。
位置标度
辅助函数xlim()和ylim(),来创建合适的对应标度,如下所示:
- 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日到8月1日的日期型标度。
默认情况下,位置标度的limits会稍微超出数据的范围。这样就保证了数据与坐标轴不会发生重叠。我们可以使用参数expand
来控制溢出量,此参数是长度为2的数值型向量。其中第一个元素给出的是乘式的溢出量,第二个参数给出的是加式的溢出量。如果你不想留任何多余的空间,就是用expand = c(0,0)
。
连续型
scale_x_continuous
和scale_y_continuous
均可接受一个trans
参数,允许指定若干种线性或非线性变换。
内建的变换器列表
名称 | 变换函数 f ( x ) f(x) f(x) | 逆变换函数 f − 1 ( y ) f^{-1}(y) f−1(y) |
---|---|---|
asn | tanh − 1 ( x ) \tanh^{-1}(x) tanh−1(x) | tanh ( y ) \tanh(y) tanh(y) |
exp | e x e^x ex | log ( y ) \log(y) log(y) |
identity | x x x | y y y |
log | log ( x ) \log(x) log(x) | e y e^y ey |
log10 | log 10 ( x ) \log_{10}(x) log10(x) | 1 0 y 10^y 10y |
log2 | log 2 ( x ) \log_{2}(x) log2(x) | 2 y 2^y 2y |
logit | log ( x 1 − x ) \log(\frac{x}{1-x}) log(1−xx) | 1 1 + e ( y ) \frac{1}{1+e(y)} 1+e(y)1 |
pow10 | 1 0 x 10^x 10x | log 10 ( y ) \log_{10}(y) log10(y) |
probit | ϕ ( x ) \phi(x) ϕ(x) | ϕ − 1 ( y ) \phi^{-1}(y) ϕ−1(y) |
recip | x − 1 x^{-1} x−1 | y − 1 y^{-1} y−1 |
reverse | − x -x −x | − y -y −y |
sqrt | x 1 / 2 x^{1/2} x1/2 | y 2 y^2 y2 |
直接绘制log10(x)
,而不去使用scale_x_log()
,绘图区域生成完全相同的结果,但坐标轴和刻度标签却是不同的。
p1 <- qplot(log10(carat),log10(price),data = diamonds)
p2 <- qplot(carat,price,data = diamonds)+
scale_x_log10()+scale_y_log10()
变换器同样可以用在coord_trans()
中。
日期和时间
目前仅支持date
类的日期值和属于POSIXct
类的时间值。其它格式可以通过as.Data()
或as.POSIXct()
对其转换。
外观控制
- major 和 minor用以按照时间的单位,即年(year)、月(month)、周(week)、日(day)、时(hour)、分(minute)、秒(second)来指定主要和次要断点的位置,并且允许以这些单位的倍数出现。例如
major = "2 weeks"
。- format指定了刻度标签的格式。
从strptime的文档中提取的常用数据格式编码。
编码 含义 %S 秒(00-59) %M 分钟(00-59) %l 小时,12小时制(1-12) %I 小时,12小时制(01-12) %H 小时,24小时制(00-23) %a 缩写的周几(Mon-Sun) %A 全称的周几(Monday-Sunday) %e 某月中的某天(1-31) %d 某月中的某天(01-31) %m 以数值表示的月份(01-12) %b 缩写的月份(Jan-Dec) %B 全称的月份(January-December) %y 不含世纪的年份(00-99) %Y 含世纪的年份(0000-9999)
library(scales)
p1 <- qplot(date,psavert,data = economics,geom = "line")+
ylab("Personal saving rate") +
geom_hline(yintercept = 2.5, colour = "grey50")
p2 <- p1 + scale_x_date(breaks = date_breaks("10 years"),labels = date_format("%Y"))
p3 <- p1 + scale_x_date(
limits = as.Date(c("2004-01-01","2005-01-01")),
labels = date_format("%Y-%m-%d")
)
颜色标度
连续型值对应三种渐变的颜色标度方法。
离散型值有两种方法。
hcl色彩空间由三部分构成,色相(hue)、彩度(chroma) 和 明度(luminance):
- hue 一个0和360之间的(角度)值,它将一种色彩赋以“颜色”属性:如蓝、红、橙等等。
- luminance 颜色的明暗程度。0为黑,1为白。
- chroma 色彩的纯度,0是灰,最大值随luminance的变化不同。
以faithful数据集生成一个二维核密度估计
#生成二维核密度估计
f2d <- with(faithful,MASS::kde2d(eruptions,waiting,h=c(1,10),n=50))
#将估计转化为等长度的变量
df <- with(f2d,cbind(expand.grid(x,y),as.vector(z)))
#给变量命名
names(df) <- c("eruptions","waiting","density")
erupt <- ggplot(df,aes(waiting,eruptions,fill = density))+
geom_tile()+
scale_x_continuous(expand = c(0,0))+
scale_y_continuous(expand = c(0,0))
erupt + scale_fill_gradient(limits = c(0,0.04))
erupt + scale_fill_gradient(limits = c(0,0.04),low="white",high = "black")
erupt + scale_fill_gradient2(limits = c(-0.04,0.04),midpoint = mean(df$density))
kde2d(x, y, h, n = 25, lims = c(range(x), range(y)))
参数----------Arguments----------
参数:x 坐标数据
参数:y坐标数据
参数:h, 向量X和Y方向的带宽。默认正常参考带宽(见bandwidth.nrd)。一个标值将被应用到两个方向。
参数:n, 在每个方向上的网格点的数量。可以是标量或长度为2的整数向量。
参数:lims, 矩形的范围覆盖由c(xl, xu, yl, yu)。
(左图)默认的颜色梯度,(中图)自定义的黑白梯度以及(右图)中点设置为密度均值的3点梯度。
要创建自定义的颜色梯度,使用scale_colour_gradientn()
即可。也可以直接使用一些包生成的调色板。
library(colorspace)
fill_gradn <- function( pl ) {
scale_fill_gradientn(colours = pl(7),limits = c(0,0.04))
}
erupt + fill_gradn(rainbow_hcl)
erupt + fill_gradn(diverge_hcl)
erupt + fill_gradn(heat_hcl)
从左至右分别为:顺序型、发散型,以及hcl热度型调色板。每种标度使用scale_fill_gradientn
生成,参数colours
分别设置为rainbow_hcl(7)
、diverge_hcl(7)
和heat_hcl(7)
。
离散型
对于类别型数据中的点而言,我们最感兴趣的调色板是"Set1"
和”Dark2“
,对面积而言则是"Set2"、"Pastel1"、"Pastel2"和”Accent“
。使用RColorBrewer::display.brewer.all()
可以列出所有的调色板。
point <- qplot(brainwt,bodywt,data=msleep,log = "xy",colour = vore)
point
area <- qplot(log10(brainwt),data = msleep,fill=vore,binwidth=1)
area
point + scale_color_brewer(palette = "Set1")
point + scale_color_brewer(palette = "Set2")
point + scale_color_brewer(palette = "Pastel1")
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Pastel1")
手动离散型标度
scale_linetype()
,scale_size_discrete()
和scale_shape()
基本上没有选项,仅是按照一定的顺序将因子水平映射到一系列值中。
如果你想要订制这些标度,使用以下手动型标度创建新的标度:scale_shape_manual()
, scale_linetype_manual()
, scale_colour_manual()
等等。手动型标度有一个重要参数values
,已指定标度值。
plot <- qplot(brainwt,bodywt,data = msleep,log = "xy")
p1 <- plot + aes(colour = vore) +
scale_color_manual(values = c("red","orange","yellow","green","blue"))
colours <- c(carni = "red","NA" ="orange",insecti = "yellow",herbi = "green",omni ="blue")
p2 <- plot + aes(colour = vore)+scale_colour_manual(values = colours)
p3 <- plot + aes(shape = vore) +
scale_shape_manual(values = c(1,2,6,0,23))
在同一幅图上展示多个变量并显示一个有用的图例。
在多数其它的图形系统中,你只需要把线上色,然后添加一个图例说明哪种颜色对应着哪个变量就可以了。这对于ggplot2不适用,因为图例是由标度负责绘制的,但标度并不知道要为线条添加何种标签。
#同一幅图上展示多个变量
huron <- data.frame(year=1875:1972,level = LakeHuron)
ggplot(huron,aes(year))+
geom_line(aes(y=level - 5),colour = "blue")+
geom_line(aes(y=level + 5),colour = "red")
通过创建从数据到颜色图形属性的一个映射,来告诉颜色标度这两条线的信息。
#创建数据的图形映射
ggplot(huron,aes(year))+
geom_line(aes(y = level - 5, colour = "below")) +
geom_line(aes(y = level + 5, colour = "above"))
基本得到了想要的效果,但是标注和颜色错误,可以通过scale_colour_manual
进行修复:
ggplot(huron,aes(year))+
geom_line(aes(y = level - 5, colour = "below")) +
geom_line(aes(y = level + 5, colour = "above")) +
scale_colour_manual("Direction",
values = c("below"="blue","above"="red"))
同一型标度
scale_identity
,意味着此时无法仅从数据本身派生出有意义的图例。
图例和坐标轴
ggplot2会尝试生成最小数量的、能够精确表达图中使用图形属性的图例。当一个变量对应了多个图形属性时,ggplot2可以通过合并图例的办法来达到精简的目的。例如,如果颜色和形状都被映射到相同的变量,那么用一个图例就足够了。被合并的图例必须拥有相同的名称(相同的图例标题)。因此,如果你修改了某个合并后的图例的名称,你将需要修改所有的相关名称。
图例和坐标轴的内容是由标度控制的,而渲染的细节是由主题系统控制的。以下列表包含了最常用的微调选项。
- 标度
name
控制着坐标轴名和图例标题,可为字符串或数学表达式。 breaks
和labels
是非常重要的标度函数参数。axis.*
和legned.*
控制着坐标轴和图例的整体外观。- 内部网格线由主要断点和次要断点的参数参数控制。可用
minor_breaks
覆盖掉次要网格线。网格线的外观是使用panel.grid.major和panel.grid.minor两个主题设置来控制的。 - 图例的位置和对齐是使用主题设置legend.position来控制的,其值可为right、left、top、botton、none(不加图例),或是一个表示位置的数值。这个数值型位置由
legend.justification
给定的相对边角位置表示(取0和1之间的值),是一个长度为2的数值型向量:右上角为c(1,1),左下角为c(0,0)。