标度控制着数据到图形属性的映射,当有需要时,ggplot2会自动添加一个默认的标度。我们确实可以在不了解标度运行原理的情况下画出许多图形,但理解标度并学会如何操纵它们则将赋予我们对图形更强的控制能力。

每一种图形属性都拥有一个默认的标度,此标度将在我们每次使用这个图形属性时被自动添加到图形中,这些标度列于下表中,默认属性粗体显示:

图形属性 离散型 连续型
颜色和填充色

brewer

grey

hue

identity

manual

gradient

gradient2

gradientn

位置 discrete

continuous

date

形状

shape

identity

manual

 
线条类型

linetype

identity

manual

 
大小

identity

manual

size

 

如果要添加一个不同的标度或修改默认标度的某些特征,我们必须构建一个新的标度,然后使用+将其添加到图形上。所有的标度构建器(scale)都拥有一套通用的命名方案,它们以scale_开头,接下来是图形属性的名称(例如:colour_,shape_,或x_)最后以标度的名称结尾(gradien、hue或manual)。比如scale_x_discrete().离散图形的颜色属性的默认标度名为scale_colour_hue(),填充色的Brewer配色标度名为scale_fill_brewer()。

> p <- qplot(sleep_total,sleep_cycle,data=msleep,colour=vore)
> p    ##默认参数
> p + scale_colour_hue("what does\nit eat?",breaks=c("herbi","carni","omni",NA),labels=c("plants","meats","both","don't know"))  ##调整标度的参数

  

标度详解,可大致分为几组:

  • 位置标度,用于将连续型、离散型和日期时间型变量映射到绘图区域,以及构造对应的坐标轴。
  • 颜色标度,用于将连续型和离散型变量映射到颜色
  • 手动标度,将离散型变量映射到我们选择的符号大小、线条类型、形状、或颜色

1.通用参数

以下参数对所有标度都通用:

  • name:设置坐标轴或图例上出现的标签。可以使用三个辅助函数xlab(),ylab(),labs()可以让我们减少部门键入。
> p <- qplot(cty,hwy,data=mpg,colour=displ) ##默认标度下图左1
> p
> p + scale_x_continuous("City mpg")  ##添加x标签 下图左2
> p + xlab("City mpg")  ##添加x标签 与上相同
> p + ylab("Highway mpg")  ##添加y标签
> p + labs(x= "City mpg",y = "Hightway mpg",colour = "Displacement")  ##添加x、y及colour标度 下图左3

> p + xlab(expression(frac(miles,gallon)))   ##x标度为表达式 下图右1
> 

  

  • limits:固定标度的定义域。连续型标度接受一个长度为2的数值型向量;离散型标度接受一个字符型向量。一旦设定limits,数据将不再进行任何训练。限制定义域可以帮助我们移除不想在图形上展示的数据,任何不在此范围内的数据将会被丢弃。
  • breaks和labels:breaks控制着显示在坐标轴或图例上的值。labels指定了应在断点处显示的标签,若设定labels,则必须同时指定breaks。

 

> p  <- qplot(cyl,wt,data=mtcars)
> p  ##图第一行 (1,1)
> p + scale_x_continuous(breaks = c(5.5,6.5))  ##图第一行 (1,2)
> p + scale_x_continuous(limits = c(5.5,6.5))  ##图第一行 (1,3)
> p <- qplot(wt,cyl,data=mtcars,colour=cyl)
> p  ##图第二行 (2,1)
> p + scale_colour_gradient(breaks=c(5.5,6.5)) ##图第二行 (2,2)
> p + scale_colour_gradient(limits=c(5.5,6.5)) ##图第三行 (2,3)

  

      

上图中第一列使用的是默认的breaks和limits,即limits=c(4,8)和breaks=4:8。中间一列重新设置了breaks:绘图区域不变,但刻度和标签的位置都被移动了。

最右列则重新定义了limits,相当多的数据落在了绘图区域之外。

2.位置标度

每幅图都一定拥有两个位置标度,水平位置和竖直位置。ggplot2提供了连续型、离散型以及日期型标度。

我们可以自行实施变换,比如我们可以直接绘制log10(x),而不去使用scale_x_log10().这两种做法将在绘图区域生成完全相同的结果,但是坐标轴和刻度标签却是不同的。

> qplot(log10(carat),log10(price),data=diamonds)  ##下图左
> qplot(carat,price,data=diamonds) + scale_x_log10() + scale_y_log10()   ##下图右
> 

  

上面的图形主体是相同的,但坐标轴上的标签是不同的。

 日期和时间

日期和时间值基本上属于连续型,但在标注坐标轴时有着特殊的处理方式。目前我们仅支持属于date类的日期值和属于POSIXct类的时间值。如果你的日期和时间值是其他格式的,则需要as.Date()或as.POSIXct()对其进行转换。

有三个参数可以控制坐标轴外观和刻度的位置:major、minor、以及format。 

  • 参数major和minor用以按照时间的单位,即年月周日时分秒来指定主要和次要断点的位置,并且允许以这些单位的倍数出现,比如,major="2weeks"将在每隔两周的位置放置一个主刻度。如果未指定,日期刻度可以自动选出合适的默认值。
  • 参数format指定了刻度标签的格式

我们通过绘制下图来演示部分参数的用法:

> library(ggplot2)
> library(scales)
> plot <- qplot(date,psavert,data=economics,geom="line") +
+ ylab("Personal saving rates")+
+ geom_hline(xintercept = 0,yintercept=0,colour="grey50")
> plot                              ##图为个人储蓄率的时间序列图形,为默认外观

  

> plot + scale_x_date(breaks = date_breaks("10 years"))  ##每隔10年为一断点

  

> plot + scale_x_date(
+ limits = as.Date(c("2004-01-01","2005-01-01")),  ######使用年月日的格式仅显示在2004年内的图形
+ labels = date_format("%Y-%m-%d")
+ )

  

3.颜色标度

连续型

根据颜色梯度中的色彩数量划分,共有三类连续型颜色梯度(即渐变色):

  • scale_colour_gradient() 和 scale_fill_gradient():双色梯度。参数low和high控制梯度两端的颜色。
  • scale_colour_gradient2() 和 scale_fill_gradient2():三色梯度。顺序为低-中-高,这两种标度还在中点处拥有一个中间色。
  • scale_colour_gradientn()   和 scale_fill_gradientn():自定义n色梯度

颜色梯度通常被用来展示一个二维表面的高度。下面我们将以faithful数据集的一个二维密度估计表面为例进行说明。

 

> library(ggplot2)
> 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)) 下图右
> 

  

上面左图为默认的颜色梯度,中间为自定义的黑白梯度,右图中点设为密度均值的3点梯度。

离散型

默认的配色方案,即scale_colour_hue(),可通过沿着hcl色轮选取均匀分布的色相来生成颜色。下图展示了应用于点和条形的三种调色板。

> point <- qplot(brainwt ,bodywt,data=msleep,log="xy",colour=vore)
> point <- qplot(brainwt ,bodywt,data=msleep,log="xy",colour=vore)
> area <- qplot(log10(brainwt),data=msleep,fill=vore,binwith=1)

> area <- qplot(log10(brainwt),data=msleep,fill=vore,binwidth=1)
> point + scale_colour_brewer(palette = "Set1") ##第一行图左

> point + scale_colour_brewer(palette = "Set2")   ##第一行图中

> point + scale_colour_brewer(palette = "Paste11") ##第一行图右

> area + scale_fill_brewer(palette = "Set1") ##第二行图左

> area + scale_fill_brewer(palette = "Set2") ##第二行图中

> area + scale_fill_brewer(palette = "Pastel1") ##第二行图右

> 

  

对于类别型数据点而言,我们最感兴趣的调色板是“Set1”和“Dark2”,对面积而言则是"Set2","Pastel1"和“Pastel2”和“Accent”。

4.手动离散型标度

离散型标度scale_linetype(),scale_size_discrete()和scale_shape()基本上没有选项,如果想定制这些标度,需要以下手动型标度来创建新的标度:scale_shape_manual(),scale_linetype_manual(),scale_colour_manual()等等。手动型标度拥有一个重要参数values,你可以使用它来指定这个标度应该生成的值。以下展示了scale_manual()的使用方法;

> plot <- qplot(brainwt,bodywt,data=msleep,log="xy")
> plot + aes(colour = vore)+
+ scale_colour_manual(values = c("red","orange","yellow","green","blue")) ##下图左

> colours <- c(carni = "red","NA"="orange",insecti="yellow",herbi="green",omni="blue")

> plot + aes(colour = vore) + scale_colour_manual(values = colours) ##下图中

> plot + aes(shape = vore) + scale_colour_manual(values = c(1,2,6,0,23))  ##下图右