ggplot2:数据分析与图形艺术 学习笔记06---第六章 标度、坐标轴和图例

浏览: 2044

6.1 简介

# 标度(scale) 控制着数据到图形属性的映射

# 也为我们提供了读图时所使用的工具:坐标轴和图例

# 没有标度,就没有将数据转化为图形属性的途径

# 执行标度的过程分为三步

# 变换(transformation)

# 训练(training)

# 映射(mapping)

# 具体将在6.2节中阐述


# 关于默认标度以及修改它们的方法,详见6.3

# 标度可以粗略地分为四类

# 位置标度

# 颜色标度

# 手动离散型标度

# 同一型标度

# 常用选项和主要使用方法在6.4节

# 标度的另一个重要角色,是生成一个允许读图者从图形属性空间到数据空间进行反向映射的 引导元素(guide)

# 引导元素的外观皆由标度的参数控制,详见6.5


6.2 标度的工作原理

# 输入变量是离散型,标度定义域是某些值组成的集合

# 输入变量是连续型,标度定义域是一个实值的区间

# 以 msleep数据为例

library(ggplot2)
head(msleep)
summary(msleep)
unique(msleep$vore)
[1] "carni" "omni" "herbi" NA "insecti"
  sleep_cycle         awake          brainwt            bodywt        
Min. :0.1167 Min. : 4.10 Min. :0.00014 Min. : 0.005
1st Qu.:0.1833 1st Qu.:10.25 1st Qu.:0.00290 1st Qu.: 0.174
Median :0.3333 Median :13.90 Median :0.01240 Median : 1.670
Mean :0.4396 Mean :13.57 Mean :0.28158 Mean : 166.136
3rd Qu.:0.5792 3rd Qu.:16.15 3rd Qu.:0.12550 3rd Qu.: 41.750
Max. :1.5000 Max. :22.10 Max. :5.71200 Max. :6654.000
NA's :51 NA's :27

# 定义域

# 离散型变量vore的定义域为 {carni,herbi,omni}

# 连续型变量bodywt的定义域为 [0.005,6654]


# 值域

# 离散型标度,它的值域是输入值对应的图形属性值组成的一个向量

# 连续型标度,它的值域是穿过某种更复杂空间的一条一维路径

# 将定义域映射到值域的过程包括以下阶段:

# 变换--》训练--》映射


6.3 用法

# 每一种图形属性都拥有一个默认的标度

# 在初始化整个图形和增加新图层时,默认的标度将被自动添加


# 如果要添加一个不同的标度或修改默认标度的某些特征

# 必须构造一个新的标度,然后使用+ 将其添加到图形上。

# 以 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()

Clipboard Image.pngClipboard Image.png

# 修改默认标度的参数,这里改变了图例的外观
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")

Clipboard Image.pngClipboard Image.png


6.4 标度详解

# 大致分为四组

# 1,位置标度 映射到绘图区域,以及构造对应的坐标轴

# 2,颜色标度 映射到颜色

# 3,手动标度 映射到符号大小、线条类型、形状或颜色,以及创建对应的图例

# 4,同一型标度 直接将变量值绘制为图形属性,而不去映射它们

6.4.1通用参数

# 1,name 设置坐标轴或图例上出现的标签

# 由于经常需要微调这些标签,所以使用三个辅助函数xlab(),ylab(), labs()

p <- qplot(cty,hwy,data = mpg,colour = displ)
p
p + scale_x_continuous("City mpg")
p + xlab("City mpg")
p + ylab("Highway mpg")
p + labs(x = "City mpg",y = "Highway",colour = "Displacement")
p + xlab(expression(frac(miles,gallon)))

Clipboard Image.pngClipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.png

# 2,limits:固定标度的定义域

# 任何不在标度定义域内的值 将被丢弃,丢弃过程发生在统计量的计算之前

# 3,breaks和labels

# breaks控制着显示在坐标轴或图例上的值

# 即 坐标轴上应该显示哪些刻度线的值

# labels指定了应在断点处显示的标签

# 如果设置了labels,必须同时指定breaks

p <- qplot(cyl,wt,data = mtcars)
p
p + scale_x_continuous(breaks = c(5.5,6.5))
p + scale_x_continuous(limits = c(5.5,6.5))

p <- qplot(wt,cyl,data =mtcars,colour = cyl)
p
p + scale_colour_gradient(breaks = c(5.5,6.5))
p + scale_colour_gradient(limits = c(5.5,6.5))

Clipboard Image.pngClipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.pngClipboard Image.png


6.4.2 位置标度

# 每幅图形一定拥有两个位置标度,一个指定水平位置(x)

# 另一个指定竖直位置(y)


# 修改坐标轴的范围是一项常见任务

# ggplot2提供了辅助函数xlim 和 ylim


# xlim(10,20) 一个从10到20的连续型标度

# ylim(20,10) 一个从20到10的反转后连续型标度

# xlim("a","b","c") 一个离散型标度

# xlim(as.Date(c("2018-05-01","2018-08-01"))) 一个从2018-5-1到2018-8-1的日期型标度


## 连续型

# 最常用的连续型位置标度是 scale_x_continuous 和 scale_y_continuous

# 它们将数据映射到x轴和y轴

# 每个连续型标度可接受一个trans参数,允许进行变换

# 每一种变换都由所谓的“变换器” 来实现

# 变换器描述了变换本身和对应的逆变换,以及如何去绘制标签


# scale_x_log10() 与 scale_x_continuous(trans = "log10") 是等价的


# 我们可以直接绘制log10(x) ,而不使用 scale_x_log10()

# 这两种方法在绘图区域生成完全相同的结果,但坐标轴和刻度标签却是不同的

qplot(log10(carat),log10(price),data = diamonds)
qplot(carat,price,data = diamonds) + scale_x_log10() + scale_y_log10()

Clipboard Image.pngClipboard Image.png


## 日期与时间

# 日期和时间值 基本上属于连续型,但在标注坐标轴时有着特殊的处理方式

# 暂时仅支持date类 和 POSIXct类的时间值


# 对于日期坐标轴,有三个参数可用于控制其外观和刻度的位置

# major,minor,format

# major 和minor 以按照时间的单位,指定主要和次要断点的位置,并且允许以这些单位的倍数出现

# 例如:major = "2 weeks" 将在每隔两周的位置放置一个主刻度

# format 指定刻度标签的格式

# 例如:14/10/2018形式显示日期,可以使用字符串“%d/%m/%y”

library(scales)
plot <- qplot(date,psavert,data =economics,geom= "line") + ylab("Personal savings rate") +
geom_hline(xintercept = 0,yintercept = 0,colour = "grey50")
plot
plot + scale_x_date(breaks = date_breaks("10 years"))
plot + scale_x_date(limits = as.Date(c("2004-01-01","2005-01-01")),labels = date_format("%Y-%m-%d"))


Clipboard Image.pngClipboard Image.pngClipboard Image.png

## 离散型

# 离散型位置标度将输入中的各水平映射为整数

# 结果的顺序可用参数breaks进行控制

# 不想要的水平可以使用limits(或 xlim(),ylim()) 进行丢弃


6.4.3 颜色标度

# 这里使用 hcl色彩空间的方案,它由三部分构成 色相(hue)、彩度(chroma)、明度(luminance)

# 色相  一个0和360之间的(角度)值,它将一种色彩赋予 颜色属性,如蓝、红、橙等

# 彩度  色彩的纯度,彩度为0是灰色,最大值随明度的变化而不同

# 明度  颜色的明暗程度,明度0为黑,明度1为白


# 连续型

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

# scale_colour_gradient(),scale_fill_gradient()  双色梯度

# scale_colour_gradient2(),scale_fill_gradient2() 三色梯度

# scale_colour_gradientn(),scale_fill_gradientn() 自定义的n色梯度

f2d <- with(faithful,MASS::kde2d(eruptions,waiting,h = c(1,10), n =50))
f2d
df <- with(f2d,cbind(expand.grid(x,y),as.vector(z)))
df
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
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))

Clipboard Image.pngClipboard Image.pngClipboard Image.png


# 使用vcd包生成的调色板

Clipboard Image.pngClipboard Image.pngClipboard Image.png

## 离散型

# 默认的配色方案,即scale_colour_hue()

# 可通过沿着hcl色轮选取均匀分布的色相来生成颜色

# 默认配色对多于8种颜色的区分比较困难

# 另一个缺点,所有颜色拥有相同的明度和彩度,黑白打印时,难以分辨


# 另一种方案是使用 ColorBrewer配色

# 对于类别型数据中的点而言,使用调色板 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

Clipboard Image.pngClipboard Image.png

point + scale_colour_brewer(palette = "Set1")
point + scale_colour_brewer(palette = "Set2")
point + scale_colour_brewer(palette = "Pastel1")
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Pastel1")

Clipboard Image.pngClipboard Image.pngClipboard Image.png

Clipboard Image.pngClipboard Image.pngClipboard Image.png

6.4.4 手动离散型标度

# 离散型标度 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")
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_shape_manual(values = c(1,2,6,0,23))

Clipboard Image.pngClipboard Image.pngClipboard Image.png

6.4.5 同一型标度

# 当你的数据能被R中的绘图函数理解时

# 即 数据空间和图形属性空间相同时,可以使用同一性标度(identity scale)

# 意味着此时无法仅从数据本身派生出有意义的图例,所以默认是不绘制图例

6.5 图例和坐标轴

# 坐标轴和坐标被共同称为 引导元素

# 它们都是标度的逆函数,允许在图中读出观测并将其映射回原始值

# 图例标题(legend title) 和坐标轴名(axis label)是等价的,并且都由标度的名称参数(name)决定

# 图例标示(legend key) 和刻度标签(tick label) 都由标度的断点参数(break)决定


# 图例和坐标轴的内容是由标度控制的,而渲染的细节是由主题系统控制的。

# 以下是最常用的微调选项

# 1,标度name控制着坐标轴名和图例标题,可为字符串或数学表达式,语法详见 plotmath

# 2,breaks和labels是非常重要的标度函数参数,如果默认的断点不合适,设置这些参数即可

# 3,主题设置axis.* 和 legend.* 控制着坐标轴和图例的整体外观

# 4,内部网格线由主要断点和次要断点的参数控住。网格线的外观使用panel.grid.major,panel.grid.minor控制

# 5,图例的位置和对齐是使用主题设置legend.position 来控制的

推荐 0
本文由 Parlan怕冷 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册