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

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.png

Clipboard 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.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.png

Clipboard Image.png

Clipboard Image.png

Clipboard Image.png

Clipboard 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.png

Clipboard Image.png

Clipboard Image.png

Clipboard 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.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.png

Clipboard Image.png

Clipboard 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.png

Clipboard Image.png

Clipboard Image.png

# 使用vcd包生成的调色板

Clipboard Image.png

Clipboard 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.png

Clipboard 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.png

Clipboard Image.png

Clipboard 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.png

Clipboard 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值