《ggplot2:数据分析与图形艺术》--学习笔记6

标度

所有的标度构建器(scale constructor)都拥有一套通用的命名方案。它们以scale_开头,接下来是图形属性的名称(例如,colour_、shape_ 或 x_),最后以标度的名称结尾(例如,gradient、hue 或 manual)。

表6.1 按图形属性和变量类型排列的各种标度

图形属性离散型连续型
颜色(colour)和填充色(fill)brewergradient
greygradient2
huegradientn
identity
manual
位置(postion)(x,y)discretecontinous
date
形状(shape)shape
identity
manual
线条类型(line type)linetype
identity
manual
大小(size)identitysize
manual
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"))
##使用一种不同的标度
p+scale_colour_brewer(palette = "Set1")

在这里插入图片描述

通用参数

  • name: 设置坐标轴或图例上出现的标签。由于经常需要微调这些标签,所以使用三个辅组函数xlab(),ylab()和labs()。
p1 <- qplot(cty,hwy,data = mpg,colour = displ)
p1
p2 <- p1 + scale_x_continuous("City mpg")
p2
p3 <- p1 + xlab("City mpg")
p4 <- p1 + ylab("Highway mpg")
p5 <- p1 + labs(x = "City mpg",y = "Highway mpg",colour = "Displacement")
p6 <- p1 + xlab(expression(frac(miles,gallon)))

在这里插入图片描述

  • limits: 固定标度的定义域。
  • breaks和labels:breaks 控制着显示在坐标轴或图例上的值,即,坐标轴上应该显示哪些刻度线的值,或一个连续型标度在一个图例中将被如何分段。labels指定了应在断点处显示的标签。
p1 <- qplot(cyl,wt,data = mtcars)
p1
p2 <- p1 + scale_x_continuous(breaks = c(5.5,6.5))
p3 <- p1 + scale_x_continuous(limits = c(5.5,6.5))
p2
p3
p4 <- qplot(wt,cyl,data = mtcars,colour = cyl)
p4
p5 <- p4 + scale_colour_gradient(breaks = c(5.5,6.5))
p5
p6 <- p4 + scale_colour_gradient(limits=c(5.5,6.5))
p6

breaks和limits的区别。

  • formatter: 如果未指定任何标签,则将在每个断点处自动调用格式刷(formatter)来格式化生成标签。

位置标度

辅助函数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日的日期型标度。

默认情况下,位置标度的limits会稍微超出数据的范围。这样就保证了数据与坐标轴不会发生重叠。我们可以使用参数expand来控制溢出量,此参数是长度为2的数值型向量。其中第一个元素给出的是乘式的溢出量,第二个参数给出的是加式的溢出量。如果你不想留任何多余的空间,就是用expand = c(0,0)

连续型
scale_x_continuousscale_y_continuous均可接受一个trans参数,允许指定若干种线性或非线性变换。

内建的变换器列表

名称变换函数 f ( x ) f(x) f(x)逆变换函数 f − 1 ( y ) f^{-1}(y) f1(y)
asn tanh ⁡ − 1 ( x ) \tanh^{-1}(x) tanh1(x) tanh ⁡ ( y ) \tanh(y) tanh(y)
exp e x e^x ex log ⁡ ( y ) \log(y) log(y)
identity x x x y y y
log log ⁡ ( x ) \log(x) log(x) e y e^y ey
log10 log ⁡ 10 ( x ) \log_{10}(x) log10(x) 1 0 y 10^y 10y
log2 log ⁡ 2 ( x ) \log_{2}(x) log2(x) 2 y 2^y 2y
logit log ⁡ ( x 1 − x ) \log(\frac{x}{1-x}) log(1xx) 1 1 + e ( y ) \frac{1}{1+e(y)} 1+e(y)1
pow10 1 0 x 10^x 10x log ⁡ 10 ( y ) \log_{10}(y) log10(y)
probit ϕ ( x ) \phi(x) ϕ(x) ϕ − 1 ( y ) \phi^{-1}(y) ϕ1(y)
recip x − 1 x^{-1} x1 y − 1 y^{-1} y1
reverse − x -x x − y -y y
sqrt x 1 / 2 x^{1/2} x1/2 y 2 y^2 y2

直接绘制log10(x),而不去使用scale_x_log(),绘图区域生成完全相同的结果,但坐标轴和刻度标签却是不同的。

p1 <- qplot(log10(carat),log10(price),data = diamonds)
p2 <- qplot(carat,price,data = diamonds)+
  scale_x_log10()+scale_y_log10()

在这里插入图片描述
变换器同样可以用在coord_trans()中。

日期和时间
目前仅支持date类的日期值和属于POSIXct类的时间值。其它格式可以通过as.Data()as.POSIXct()对其转换。

外观控制

  • major 和 minor用以按照时间的单位,即年(year)、月(month)、周(week)、日(day)、时(hour)、分(minute)、秒(second)来指定主要和次要断点的位置,并且允许以这些单位的倍数出现。例如major = "2 weeks"
  • format指定了刻度标签的格式。
    从strptime的文档中提取的常用数据格式编码。
编码含义
%S秒(00-59)
%M分钟(00-59)
%l小时,12小时制(1-12)
%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)
library(scales)
p1 <- qplot(date,psavert,data = economics,geom = "line")+
  ylab("Personal saving rate") +
  geom_hline(yintercept = 2.5, colour = "grey50")

p2 <- p1 + scale_x_date(breaks = date_breaks("10 years"),labels = date_format("%Y"))
p3 <- p1 + scale_x_date(
  limits = as.Date(c("2004-01-01","2005-01-01")),
  labels = date_format("%Y-%m-%d")
)

个人存储率的时间序列图形。

颜色标度

连续型值对应三种渐变的颜色标度方法。
离散型值有两种方法。
hcl色彩空间由三部分构成,色相(hue)彩度(chroma)明度(luminance):

  • hue 一个0和360之间的(角度)值,它将一种色彩赋以“颜色”属性:如蓝、红、橙等等。
  • luminance 颜色的明暗程度。0为黑,1为白。
  • chroma 色彩的纯度,0是灰,最大值随luminance的变化不同。

以faithful数据集生成一个二维核密度估计

#生成二维核密度估计
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)) 

kde2d(x, y, h, n = 25, lims = c(range(x), range(y)))
参数----------Arguments----------
参数:x 坐标数据
参数:y坐标数据
参数:h, 向量X和Y方向的带宽。默认正常参考带宽(见bandwidth.nrd)。一个标值将被应用到两个方向。
参数:n, 在每个方向上的网格点的数量。可以是标量或长度为2的整数向量。
参数:lims, 矩形的范围覆盖由c(xl, xu, yl, yu)。

在这里插入图片描述(左图)默认的颜色梯度,(中图)自定义的黑白梯度以及(右图)中点设置为密度均值的3点梯度。

要创建自定义的颜色梯度,使用scale_colour_gradientn()即可。也可以直接使用一些包生成的调色板。

library(colorspace)
fill_gradn <- function( pl ) {
  scale_fill_gradientn(colours = pl(7),limits = c(0,0.04))
}
erupt + fill_gradn(rainbow_hcl)
erupt + fill_gradn(diverge_hcl)
erupt + fill_gradn(heat_hcl)

在这里插入图片描述从左至右分别为:顺序型、发散型,以及hcl热度型调色板。每种标度使用scale_fill_gradientn生成,参数colours分别设置为rainbow_hcl(7)diverge_hcl(7)heat_hcl(7)

离散型
对于类别型数据中的点而言,我们最感兴趣的调色板是"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
point + scale_color_brewer(palette = "Set1")
point + scale_color_brewer(palette = "Set2")
point + scale_color_brewer(palette = "Pastel1")
area + scale_fill_brewer(palette = "Set1")
area + scale_fill_brewer(palette = "Set2")
area + scale_fill_brewer(palette = "Pastel1")

在这里插入图片描述

手动离散型标度

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")
p1 <- plot + aes(colour = vore) +
  scale_color_manual(values = c("red","orange","yellow","green","blue"))
colours <- c(carni = "red","NA" ="orange",insecti = "yellow",herbi = "green",omni ="blue")
p2 <- plot + aes(colour = vore)+scale_colour_manual(values = colours)
p3 <- plot + aes(shape = vore) +
  scale_shape_manual(values = c(1,2,6,0,23))

在这里插入图片描述
在同一幅图上展示多个变量并显示一个有用的图例。
在多数其它的图形系统中,你只需要把线上色,然后添加一个图例说明哪种颜色对应着哪个变量就可以了。这对于ggplot2不适用,因为图例是由标度负责绘制的,但标度并不知道要为线条添加何种标签。

#同一幅图上展示多个变量
huron <- data.frame(year=1875:1972,level = LakeHuron)
ggplot(huron,aes(year))+
  geom_line(aes(y=level - 5),colour = "blue")+
  geom_line(aes(y=level + 5),colour = "red")

在这里插入图片描述通过创建从数据到颜色图形属性的一个映射,来告诉颜色标度这两条线的信息。

#创建数据的图形映射
ggplot(huron,aes(year))+
  geom_line(aes(y = level - 5, colour = "below")) +
  geom_line(aes(y = level + 5, colour = "above"))

在这里插入图片描述基本得到了想要的效果,但是标注和颜色错误,可以通过scale_colour_manual进行修复:

ggplot(huron,aes(year))+
  geom_line(aes(y = level - 5, colour = "below")) +
  geom_line(aes(y = level + 5, colour = "above")) +
  scale_colour_manual("Direction",
                      values = c("below"="blue","above"="red"))

在这里插入图片描述

同一型标度

scale_identity,意味着此时无法仅从数据本身派生出有意义的图例。

图例和坐标轴

在这里插入图片描述ggplot2会尝试生成最小数量的、能够精确表达图中使用图形属性的图例。当一个变量对应了多个图形属性时,ggplot2可以通过合并图例的办法来达到精简的目的。例如,如果颜色和形状都被映射到相同的变量,那么用一个图例就足够了。被合并的图例必须拥有相同的名称(相同的图例标题)。因此,如果你修改了某个合并后的图例的名称,你将需要修改所有的相关名称。

图例和坐标轴的内容是由标度控制的,而渲染的细节是由主题系统控制的。以下列表包含了最常用的微调选项。

  • 标度 name控制着坐标轴名和图例标题,可为字符串或数学表达式。
  • breakslabels是非常重要的标度函数参数。
  • axis.*legned.*控制着坐标轴和图例的整体外观。
  • 内部网格线由主要断点和次要断点的参数参数控制。可用minor_breaks覆盖掉次要网格线。网格线的外观是使用panel.grid.major和panel.grid.minor两个主题设置来控制的。
  • 图例的位置和对齐是使用主题设置legend.position来控制的,其值可为right、left、top、botton、none(不加图例),或是一个表示位置的数值。这个数值型位置由legend.justification给定的相对边角位置表示(取0和1之间的值),是一个长度为2的数值型向量:右上角为c(1,1),左下角为c(0,0)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q_M_Y_Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值