########## 第三章 ##########
qplot(displ, hwy, data=mpg, colour=factor(cyl), facets=.~year) + geom_smooth()
p <- qplot(displ, hwy, data=mpg, colour=factor(cyl))
# 将图形呈现在屏幕上
print(p)
# 查看图形的结构
summary(p)
# 把图形的缓存副本保存到磁盘上
save(p, file="plot.rdata")
# 将图形保存在磁盘上
ggsave("plot.png", width=5, height=5)
# 重现已保存的图形
load("plot.rdata")
########## 第四章 ##########
# 在加上图层之前,该图形无法显示
p <- ggplot(diamonds, aes(carat)) #图形对象
p1 <- p + layer(
geom="bar",
geom_params=list(fill="steelblue"),
stat="bin",
stat_params=list(binwidth=2),
position = "identity"
)
p1
# 可以用快捷函数来添加图层。快捷函数通常是geom_或stat_开头。p1等价于p2。
p2 <- p + geom_histogram(binwidth = 2,fill="steelblue")
ggplot(msleep, aes(sleep_rem/sleep_total, awake)) + geom_point()
#上面等价于下面,都是 图形对象+图层
qplot(sleep_rem/sleep_total, awake, data=msleep)
# 可以给qplot生成的图形对象加图层,以下三种写法等价
qplot(sleep_rem/sleep_total, awake, data=msleep) + geom_smooth() #给qplot添加图层
qplot(sleep_rem/sleep_total, awake, data=msleep, geom=c("point", "smooth"))
ggplot(msleep, aes(sleep_rem/sleep_total, awake)) + geom_point() + geom_smooth() #这三个都等价
p <- ggplot(msleep, aes(sleep_rem/sleep_total, awake))
#summary函数首先给出图形对象的默认设置,然后给出每个图层的信息
summary(p)
p <- p + geom_point() #加上图层
summary(p) #展示每个图层的信息
### 将图层储存起来,方便复用
library(scales)
# 创建了一个带有半透明深蓝色回归线的图层
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
qplot(bodywt, brainwt, data=msleep, log="xy") + bestfit
# 使用 %+% 给图形对象添加新的数据集以代替原来的数据集
p <- ggplot(mtcars, aes(mpg, wt, colour=cyl)) + geom_point()
p
mtcars <- transform(mtcars, mpg=mpg^2) # !!!
p %+% mtcars
p <- ggplot(mtcars, aes(x=mpg, y=wt))
# 用默认的参数映射来添加图层
p + geom_point()
# 默认映射可以在新图层里扩充和修改
p + geom_point(aes(colour=factor(cyl)))
p + geom_point(aes(y=disp))
# 设定和映射的区别
p <- ggplot(mtcars, aes(mpg, wt))
p + geom_point(colour="darkblue") # 设定改的是图形属性
p + geom_point(aes(colour="darkblue")) #映射创建了只有一个值的离散型变量
qplot(mpg, wt, data=mtcars, colour="darkblue") #映射
qplot(mpg, wt, data=mtcars, colour=I("darkblue")) # 在qplot中将某个值放到I()中来实现设定
# 分组
library(nlme)
# 用分组参数作“细面图”
p <- ggplot(Oxboys, aes(age, height, group=Subject)) + geom_line()
# 因没有正确分组而毫无用处
ggplot(Oxboys, aes(age, height)) + geom_line()
#在添加的图层上可以进行不同的分组
p + geom_smooth(aes(group=Subject), method="lm", se=F) #给每个人添加一条拟合直线
p + geom_smooth(method="lm", se=F) #默认分组方式,给每个人添加一条拟合直线
p + geom_smooth(aes(group=1), method="lm", se=F) #给所有人添加一条拟合直线
# 修改默认分组
boysbox <- ggplot(Oxboys, aes(Occasion, height)) + geom_boxplot()
# Occasion是一个离散型变量,因此不需设定group属性,自动将其设定为默认分组变量
boysbox
# 叠加的图层想要按照个体分组,则需要修改第一图层的默认分组变量
boysbox + geom_line(aes(group=Subject), colour="#3366FF")
# 用线性插值法来实现渐变的线条图
xgrid <- with(df, seq(min(x), max(x), length=50))
interp <- data.frame(
x = xgrid,
y = approx(df$x, df$y, xout=xgrid)$y,
colour = approx(df$x, df$colour, xout=xgrid)$y
)
qplot(x, y, data=df, colour=colour, size=I(5)) + geom_line(data=interp, size=2)
# 统计变换可以在原数据集的基础上生成新的变量。生成的变量需要用..括起来。生成的新变量可以被直接调用
ggplot(diamonds, aes(carat)) + geom_histogram(aes(y=..density..), binwidth=0.1)
qplot(carat, ..density.., data=diamonds, geom="histogram", binwidth=0.1)
# 将几何对象和统计变换相结合
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(y=1,fill=..count..),binwidth=0.1, geom="tile", position="identity"
) # ?代码有问题,怎么画瓦片图?
# 综合运用
require(nlme, quiet=TURE, warn.conflicts=FALSE)
model <- lme(height~age, data=Oxboys, random = ~1+age|Subject)
oplot <- ggplot(Oxboys, aes(age, height, group=Subject)) + geom_line()
# 对比模型拟合效果的两种方式之方式一:
# 将预测值和真实值画在同一个图里,观察深层拟合的情况
age_grid <- seq(-1, 1, length=10)
subjects <- unique(Oxboys$Subject)
preds <- expand.grid(age=age_grid, Subject=subjects)
preds$height <- predict(model, preds)
# 由于新的预测值的数据集中,变量名和默认数据集中一样,因此可以省略
oplot + geom_line(data=preds, colour="#3366FF", seize=0.4)
# 对比模型拟合效果的两种方式之方式二:
# 绘制残差
Oxboys$fitted <- predict(model)
Oxboys$resid <- with(Oxboys, fitted-height)
# 更改数据集为Oxboys,并添加基于整体的平滑曲线
oplot %+% Oxboys + aes(y=resid) + geom_smooth(aes(group=1))
# 残差不是随机分布,因此在模型中添加二次项,重新拟合模型
model2 <- update(model, height~age+I(age^2))
Oxboys$fitted2 <- predict(model2)
Oxboys$resid2 <- with(Oxboys, fitted2-height)
oplot %+% Oxboys +aes(y=resid2) + geom_smooth(aes(group=1))