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
R:ggplot2(13),第6章 标度、坐标轴和图例(1)
> 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”))对这四个分类分别命名。
R:ggplot2(13),第6章 标度、坐标轴和图例(1)

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
    R:ggplot2(13),第6章 标度、坐标轴和图例(1)
  • 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图
R:ggplot2(13),第6章 标度、坐标轴和图例(1)
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()
记住这几个实际例子,能够解决多个问题。
R:ggplot2(13),第6章 标度、坐标轴和图例(1)

离散型

离散型位置标度将输入中的各水平映射为整数。结果的顺序可用参数breaks进行控制。不想要的水平可以使用limits(或使用xlim()或ylim())进行丢弃。对于连续型位置标度,可用breaks和limits进行分割和限制,可用as.numeric()转换为数值。