R:ggplot2(13),第6章 标度、坐标轴和图例(1)
《ggplot2:数据分析与图形艺术》
第6章 标度、坐标轴和图例
6.3 用法
每一种图形属性都拥有一个默认都标度,此标度将在我们每次使用这个图形属性时被自动添加到图形中。见表6.1。标度都种类依赖于变量都类型:标度可为连续型(变量为数值时)或离散型(变量为因子、逻辑值、字符时)。要修改默认的标度用到set_default_scale()。
表6.1 按图形属性和变量类型排列的各种标度。默认标度以粗体显示。默认的标度根据变量是连续型或是离散型而有所不同。形状(shape)和线条类型(line type)没有摩尔你的连续型标度;大小(size)没有默认的离散型标度。
图形属性 | 离散型 | 连续型 |
---|---|---|
颜色(colour)和填充色(fill) | brewer | gradient |
grey | gradient2 | |
hue | gradientn | |
identity | ||
manual | ||
位置(position)(x, y) | discrete | continuous |
date | ||
形状(shape) | shape | |
identity | ||
manual | ||
线条类型(line type) | linetype | |
identiey | ||
manual | ||
大小(size) | identiey | size |
manual |
所以在增加新图形时会修改默认标度,在变量类型和标度类型不匹配的情况下,我们必须构造一个新的标度,然后使用 + 添加到图形上。
所有标度构造器(scale constructor)都拥有一套通用的命名方案。
它们以scale_
开头,接下来是图形属性的名称(例如,colour_、shape_或x_),最后以标度的名称结尾(例如,gradient、hue或manual)。举例来说,离散型数据的颜色图形属性的默认标度名为scale_colour_hue()
,填充色的Brewer配色标度名为scale_fill_brewer()
。
> 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"))
#修改了默认的标度,"What does\nit eat?"表示图例的标注。breaks=c(“herbi”, “carni”, “omni”, NA)表示只显示四种分类,labels=c(“plants”, “meat”, “both”, “don’t know”))对这四个分类分别命名。
6.4 标度详解
标度可大致分为四组:
- 位置标度:用于将连续型、离散型和日期-时间型变量映射到绘图区域,以及构造对应的坐标轴。
- 颜色标度,用于将连续型和离散型变量映射到颜色。
- 手动标度,用于将离散型变量映射到我们选择的符号大小、线条类型、形状或颜色,以及创建对应的图例。
- 同一型标度,用于直接将变量值绘制为图形属性,而不去映射它们。举例来说,假设我们想要将变量映射为符号的颜色,而此变量本身就是一个由颜色值组成的向量,那么我们就无须再将其映射为其他的颜色,直接渲染这些值本身即可。
6.4.1 通用参数
以下参数对所有标度通用。name,limits,breaks,labels
- name:设置坐标轴或图例上出现的标签。可以指定字符串(使用\n换行)或数学表达式(语法如?plotmath所述)。需要三个辅助函数xlab()、ylab()和labs(),来配合标签展示。
例如:
p <- qplot(cty, hwy, data=mpg, colour=displ)
p
p + scale_x_continuous(“City mpg”) #设定x轴标签
p + xlab(“City mpg”) #效果同上
p + ylab(“Highway mpg”) #设定y轴标签
p + labs(x=“City mpg”, y=“Highway mpg”, colour=“Displacement”) #设定x轴,y轴,图例的标签,因为p是用colour对散点图添加的颜色。
p + xlab(expression(frac(miles, gallon))) #x轴标签用表达式进行表示 - limits:固定标度的定义域。显示定义域可以帮助我们移除不想在图形上展示的数据,即设置比数据的完整范围更小的limits)。连续型标度接受一个长度为2的数值型向量;离散型标度接受一个字符型向量。
- breaks和labels:breaks控制着显示在坐标轴或图例上的值,即,坐标轴上应该显示哪些刻度线的值,或一个连续型标度在一个图例中将被如何分段。labels指定了应该在断点处显示的标签。若设置了labels,则必须同时指定breaks,这样两个参数才能正确匹配。breaks影响显示在坐标轴和图例上的元素,而limits影响显示在图形上的元素。
例如:> p <- qplot(cyl, wt, data=mtcars)
> p
> p + scale_x_continuous(breaks=c(5.6, 6.5))
#x轴仅仅显示两个值5.6和6.5,范围没有变化,其余效果同图1> p + scale_x_continuous(limits=c(5.6, 6.5))
#x轴的范围从4到8,修改为从5.6到6.5
#图形属性为位置(x轴),其连续型变量默认是continuous> p <- qplot(cyl, wt, data=mtcars, colour=cyl)
> p
> p + scale_colour_gradient(breaks=c(5.5, 6.5))
#图例仅仅显示两个值5.6和6.5,范围没有变化,其余效果同图4> p + scale_colour_gradient(limits=c(5.5, 6.5))
#图例的范围从4到8,修改为从5.6到6.5,所以不在范围内的点没有进行颜色标记
#图形属性为颜色(colour),其连续型变量默认是gradient
- formatter:如果未指定任何标签,则将在每个断点处自动调用格式刷(formatter)来格式化生成标签。对于连续型标度,可用的标签刷为:comma,percent,dollar和scientific;对于离散型标度,则为abbreviate。
6.4.2 位置标度
每幅图一定拥有两个位置标度,x标度和y标度。ggplot2提供了连续型、离散型(针对因子型、字符型和逻辑向量)以及日期型标度。ggplot2提供了一对辅助函数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日的日期型标度。
函数xlim()和ylim()的作用仅仅是截断坐标轴的刻度范围只显示xlim()或ylim()当中出现的数据,并没有图形放大的作用;如果想实现图形放大,需要用到coord_cartesian()函数的参数xlim和ylim。
另外,如果使用了scale_x_continuous()当中的limits和break则不需要用到xlim()函数。二者避免冲突。
连续型
最常用的连续型位置标度是scale_x_continuous和scale_y_continuous,它们均将数据映射到x轴和y轴。每个连续型标度均可接受一个trans参数,允许指定若干种线性或非线性的变换。而每一种变换都是由所谓的“变换器”来实现的,变换器描述了变换本身和对应的逆变换,以及如何去绘制标签。常用变换器如下:
表6.2内建的变换器列表。
名称 | 变换函数 f(x) | 逆变换函数 f-1(y) |
---|---|---|
asn | tanh-1(x) | tanh(y) |
exp | ex | log(y) |
identity | x | y |
log | log(x) | ey |
log10 | log10(x) | 10y |
log2 | log2(x) | 2y |
logit | log(x/(1-x)) | 1/(1+ey) |
pow10 | 10x | log10(y) |
probit | ||
recip | x-1 | y-1 |
reverse | -x | -y |
sqrt | x1/2 | y2 |
变换通常被用来修改位置标度,所以对于x,y和z标度都是有简便写法的:scale_x_log10()和scale_x_continuous(trans=“log10”)是等价的。
我们在绘制log10(x)图形时一般不会使用scale_x_log10(),虽然这两种做法在绘图区域生成完全相同的结果,但坐标轴和刻度标签确是不同的。如果我们使用变换后的标度,坐标轴将依照原始的数据空间进行标注。 例如:> qplot(log10(carat), log10(price), data=diamonds)
#绘制结果为A图> qplot(carat, price, data=diamonds) + scale_x_log10() + scale_y_log10()
#绘制结果为B图
A图和B图同样的图形效果,都是x及y轴的log10值,但是B图的图形x轴及y轴没有log10值的标签,所以在实际绘图中要选择图A的方法进行绘制,首先统计数据再进行绘图。
日期和时间
日期和时间属于连续型,但在标注坐标轴时有特殊的处理方式。仅支持属于date类的日期值和属于POSIXct类的时间值。如果是其他格式需要用as.Date()和as.POSIXct()进行转换。
日期坐标轴有以下三个可用参数:major,minor,format
时间的刻度函数是scale_x_date()
- 参数major和minor用以按照时间的单位,即年(year),月(month),周(week),日(day),时(hour),分(minute),秒(second)来指定主要和次要断点的位置,并且允许以这些单位的倍数出现。例如,major = "2 weeks"将在每隔两周的位置放置一个刻度。如果未被指定,日期标度可以自动选出合适的默认值。
- 参数format指定来刻度标签的格式,例如14/10/1979形式的日期,用字符串"%d/%m/%y"表示。
表6.3从strptime的文档中提取的常用数据格式编码。依照时间从短到长排列。
编码 | 含义 |
---|---|
%S | 秒(00-59) |
%M | 分钟(00-59) |
%l (字母L的小写) | 小时,12小时制(1-12) |
%I (字母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) |
这种表示方法可举例说明:> plot <- qplot(date, psavert, data=economics, geom="line") + ylab("Personal saving rate") + geom_hline(yintercept = 5, colour = "grey50")
> plot
#A图> plot + scale_x_date(breaks = date_breaks("20 years"))
#B图,对于时间刻度,breaks的用法是对于时间的date_breaks()函数。> plot + scale_x_date(limits = as.Date(c("2004-01-01", "2005-01-01")), labels = date_format("%Y-%m-%d"))
#C图,日期形式的刻度标签函数date_format()。
记住这几个实际例子,能够解决多个问题。
离散型
离散型位置标度将输入中的各水平映射为整数。结果的顺序可用参数breaks进行控制。不想要的水平可以使用limits(或使用xlim()或ylim())进行丢弃。对于连续型位置标度,可用breaks和limits进行分割和限制,可用as.numeric()转换为数值。