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

创建绘图对象

如果想手动创建图形对象,就要用到 ggplot() 函数。其有两个主要的参数:数据 和图像属性 映射 ase()。

图层

p <- ggplot(diamonds, aes(x = carat))
p <- p + layer(
  geom = "bar",
  geom_params = list(fill = "steelblue"),
  stat = "bin",
  stat_params = list(binwidth = 2)
  )
  p

该图层的参数设定得非常细致但过于繁琐,我们可以用 快捷函数 (short-cut)来简化上面的代码。下面的代码将生成与上述代码完全相同的图层。

geom_histogram(binwidth = 2,fill = “steelblue”)

所有这类快捷函数都有相同的形式 – 以geom_ 或者 stat_ 开头。
它们的参数定义了图层的各个组件:

  • mapping(可选): 通过aes() 函数来设定。
  • data(可选):它会修改默认的数据集。大部分情况下该参数被省略掉,默认数据集将被调用。
  • :geom或stat的参数,例如直方图的组距(binwidth)或者loess光滑曲线的带宽(bandwidth)。
  • geomstat (可选):我们可以修改geom默认的stat值,也可以修改stat所默认的geom值。指几何对象或统计变换 1 的名称。
  • postion(可选):选择一种调整对象重合的方式。

图形对象可以存储到一个变量里。summary函数可以查看图形对象结构,而不用直接绘制出图形。

library(ggplot2)
p <- ggplot(msleep,aes(sleep_rem / sleep_total, awake))
summary(p)

data: name, genus, vore, order, conservation, sleep_total, sleep_rem, sleep_cycle, awake, brainwt, bodywt
[83x11]
mapping: x = ~sleep_rem/sleep_total, y = ~awake
faceting: <ggproto object: Class FacetNull, Facet, gg>
compute_layout: function
draw_back: function
draw_front: function
draw_labels: function
draw_panels: function
finish_data: function
init_scales: function
map_data: function
params: list
setup_data: function
setup_params: function
shrink: TRUE
train_scales: function
vars: function
super: <ggproto object: Class FacetNull, Facet, gg>

图层是普通的R对象,所以可以存储到变量里去,这有利于代码避繁就简。例如一组图形可以先用不同的数据进行初始化,然后加上相同的图层,如果后面想改变图层,只需要修改一个地方即可。

bestfit <- geom_smooth(method = "lm",se=F,
                       colour = alpha("steelblue",0.5),size = 2)
qplot(sleep_rem,sleep_total,data=msleep)+bestfit
qplot(awake,brainwt,data = msleep,log = "y")+bestfit

在这里插入图片描述
在这里插入图片描述

数据

ggplot2对于数据集的要求:必须是一个数据框(data frame)。ggplot2会从我们给定的数据框中提取绘图所需要的变量,并生成一个新的数据集,而不是直接在原数据上进行数据变换。

利用相同的代码、不同的数据集绘图——只需要改变数据集即可。用 %+% 来添加新的数据集。

p <- ggplot(mtcars,aes(mpg,wt,colour = cyl))+geom_point()
p
mtcars <- transform(mtcars,mpg = mpg ^2)
p %+% mtcars

图形属性映射

aes() 函数用来将数据变量映射到图形中,从而使变量成为可以被感知的图形属性。也可以使用变量的函数作为参数。
每个aes()函数里的变量都必须包含于默认数据集或者图层数据集中,这是保证ggplot2对象都是自含型的重要方式之一,这样方便存储和重复使用。

图和图层

+ 修改图形属性。
图形对象p中默认的映射可以在新图层里进行扩充或修改。

图层图形属性可以添加、修改和删除默认映射:

操作层图形属性结果
添加aes(colour = cyl)aes(mpg, wt, colour = cyl)
修改aes(y = disp)aes(mpg, disp)
删除aes(y = NULL)aes(mpg)

设定和映射

除了可以将一个图形属性映射到一个变量,你也可以在图层的参数里将其设定为一个单一值(例如,colour = “red”)。

p  <- ggplot(mtcars,aes(mpg, wt))
p1 <- p + geom_point(colour = "darkblue")

这里将点的颜色设定为深蓝色。这和下面的例子有很大区别:

p2 <- p + geom_point(aes(colour = "darkblue")) +
  theme(legend.position = '')

这里将colour映射到“darkblue”颜色。实际上是先创建了一个只含有“darkblue”字符的变量,然后将colour映射到这个新变量。这个变量值是离散型的,所以默认的颜色将用色轮上等间距的颜色,对应色轮上的桃红色。

library(grid)
grid.newpage()
pushViewport(viewport(layout = grid.layout(1,2)))
print(p1,vp=viewport(layout.pos.row = 1,layout.pos.col = 1))
print(p2,vp=viewport(layout.pos.row = 1,layout.pos.col = 2))

在这里插入图片描述在使用qplot()函数的时候,可以将某个值放到I()里来实现映射(例如,colour = I("darkblue"))。

分组

在ggplot2里,几何对象可以大致分为个体(individual)和群组(collective)几何对象两大类。群组几何对象用来表示多条观测,要用到 分组(group) 图形属性。
这里加载nlme包,来说明。

library(nlme)
p <- ggplot(Oxboys,aes(age,height,group=Subject))+geom_line()

分组变量 group = Subject我们指定Subject为分组变量,每个男孩对应一条线。

根据 所有 男孩的年龄和身高在图中添加一条光滑线条。

p + geom_smooth(aes(group = 1),method = "lm",se=F)

group = 1group = 1 绘制出的线条才是基于整体数据的,否则,会给每个男孩添加一条光滑线条。

修改默认分组
如果图像中含有离散型变量,而你却想绘制连接所有分组的线条,那么可以用平行坐标图时所用的策略。

boysbox <- ggplot(Oxboys,aes(Occasion,height))+geom_boxplot()

在这里插入图片描述这里没有必要设定组图形属性,因为Occasion是一个离散型变量,所以默认的分组变量就是Occasion。要在此基础上添加个体轨迹,我们需要用aes(group = Subject) 修改第一层默认分组。

boysbox + geom_line(aes(group = Subject),colour="#FF66FF")

在这里插入图片描述

匹配图形属性和图形对象

线条和路径遵循差一原则:观测点比线段数目多一。如果数据是离散的,在相邻的颜色间插入其它颜色是没有任何意义的。如果颜色是连续的,可以在相邻的颜色间进行插补,但默认条件下R不会这样做。

x=c(1,3,5)
y=c(1,3,5)
colour = c(1,3,5)
dat=data.frame(x,y,colour)
xgrid <- with(dat,seq(min(x),max(x),length = 50))
interp <- data.frame(
  x = xgrid,
  y = approx(dat$x,dat$y,xout = xgrid)$y,
  colour = approx(dat$x,dat$y,xout = xgrid)$y
  )
summary(interp)
qplot(x,y,data=dat,colour=colour,size=I(5))+
  geom_line(data = interp,size=2)

在这里插入图片描述

几何对象

几何图形对象,简称为geom, 它执行着图层的实际渲染,控制着生成的图像类型。
ggplot2 中的几何对象

名称描述
abline线,由斜率和截距决定
area面积图(area plot)
bar条形图,以x轴为底的矩形
bin2d2维热图
blank空白,什么的也不画
boxplot箱线图
contour等高线图
crossbar带有水平中心线的盒子图
density光滑密度曲线图
density2d二维密度等高线图
dotplot“点直方图”,用点来表示观测值的个数
errorbar误差棒
errorbarh水平的误差棒
freqpoly频率多边形图
hex用六边形表示的2维热图
histogram直方图
hline水平线
jitter给点添加扰动,减轻图形重叠问题
line按照x坐标的大小顺序依次连接各个观测值
linerange一条代表一个区间的竖直线
map基准地图里的多边形
path按数据的原始顺序连接各个观测值
point点,用来绘制散点图
pointrange用一条中间带点的竖直线代表一个区间
polygon多边形,相当于一个填充的路径
quantile添加分位数回归线
raster高效的矩形瓦片图
rect2维的矩形图
ribbon色带图,连续的x值所对应的y的范围
rug边际地毯图
segment添加线段或箭头
smooth添加光滑的条件均值线
step以阶梯形式连接各个观测值
text文本注释
tile瓦片图
violion小提琴图
vline竖直线

默认的统计变换和图形属性 黑体图形属性是必须声明的参数。

名称默认的统计变换图形属性
ablineablinecolour, linetype, size
areaidentitycolour, fill, linetype, size, x, y
barbincolour, fill, linetype, size, weight, x
bin2dblin2dcolour, fill, linetype, size, weight, xmax, xmin, ymax, ymin
blankidentity
boxplotboxplotcolour, fill, lower, middle, size, **upper, ** weight, x, ymax, ymin

可通过??ggolot2::geom_boxplot??ggolot2::geom_abline 在R终端查询对应的统计变换和图形属性

统计变换

简称为stat,即对数据进行统计变换。调用变换后的统计量需要用..围起来。
例如,直方图的stat_bin 统计变换会生成如下变量:

  • count, 每个组里观测值的数目:
  • density,每个组里观测值的密度(占整体的百分数/组宽);
  • x,组的中心位置。
    直方图默认将条形的高度赋值为观测值的频数(count),可以用密度(density)来代替。
ggplot(diamonds,aes(carat)) +
  geom_histogram(aes(y = ..density..), binwidth = 0.1)

在这里插入图片描述
加载了ggplot2包后,通过?stat_bin 等查看统计变换的描述及计算的变量:

Computed variables

count
number of points in bin
density
density of points in bin, scaled to integrate to 1
ncount
count, scaled to maximum of 1
ndensity
density, scaled to maximum of 1

位置调整

对该层中的元素位置进行微调。

名称描述
dodge避免重叠,并排放置
fill堆叠图形元素并将高度标准化为1
identity不做任何调整
jitter给点添加扰动避免重合
stack将图形元素堆叠起来

整合

几何对象与统计变换组合

d <- ggplot(diamonds,aes(carat)) + xlim(0,3)
d + stat_bin(aes(ymax=..count..),binwidth = 0.1,geom = "area")
d + stat_bin(
  aes(size=..density..),binwidth = 0.1,
  geom = "point",position = "identity"
)
d + stat_bin(
  aes(fill=..count..),binwidth = 0.1,
  geom = "tile",position = "fill"
)

在这里插入图片描述

显示以计算过的统计量

不使用统计变换时可以使用stat_identity()


  1. 译者注:此处原书只写了几何对象,没有写统计变换,译者认为应该加上。 ↩︎

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值