初学ggplot2(一)
翻开《ggplot2:数据分析与图形艺术》,给人一种耳目一新的感觉,它与传统的R绘图工具有本质的区别,借用黄宝臣对ggplot2的几点总结:
1)ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无关的绘图分离;
2)ggplot2是按图层作图;
3)ggplot2保有命令式作图的调整函数,使其更具灵活性;
4)ggplot2将常见的统计变换融入到了绘图中。
本文先从ggplot2包中的基础绘制函数qplot()开始。
一、qplot()函数实现快速绘图
了解该函数的语法:
qplot(x, y = NULL, ..., data, facets = NULL,
margins = FALSE,geom = "auto", stat = list(NULL),
position = list(NULL), xlim = c(NA,NA),
ylim = c(NA, NA), log = "", main = NULL,
xlab = deparse(substitute(x)),
ylab = deparse(substitute(y)), asp = NA)
x, y与基本的plot()函数参数一致,指定图中x坐标和y坐标的值;
...为每个图层指定其他图形装饰属性,如颜色(colour)、形状(shape)、大小(size)等;
data用于要分析的数据框;
facets用来指定用于分面的变量,默认不指定分面变量;
margins是否呈现图形边缘,默认不显示图形边缘;
geom为设定的几何对象,几何对象可以是一种,也可以是多种组合,如下为常用的几何对象:
geom = 'point',绘制散点图,当参数x和y指定时,默认为散点图;
geom = 'smooth',绘制平滑曲线和标准误,method参数可以指定平滑曲线的方法,如lm,loess,gam等;
geom = 'boxplot',绘制箱线图,参数colour控制外框颜色,fill指定填充颜色,size调节线的粗细;
geom = 'path'或geom = 'line',绘制线图;
geom = 'histogram',绘制直方图,当只提供x参数的数据时默认为直方图,可以指定直方图的组距参数binwidth = ,fill参数为直方图添加填充颜色;
geom = 'freqploy',绘制频率多变形;
geom = 'density',绘制密度曲线,adjust参数控制曲线的平滑程度,取值越大,越平滑;
geom = 'bar',绘制条形图,对于明细数据,条形图的纵坐标为频数;对于已经汇总的数据需要使用weight参数指定已汇总的变量;
geom = 'jitter',绘制扰动点图,可以查看各位置下的疏密情况,还可以配合alpha = I()参数一起使用,alpha值越小则越透明;
stat为字符向量,用于指定统计函数;
position为字符向量,用于调整图形的位置;
xlim和ylim指定图形横纵坐标的范围,与plot函数中xlim,ylim参数一致;
log进行横纵坐标的对数转换,可也是log='x'或log='y'或log='xy';
main为图形添加标题,与plot函数中main参数一致;
xlab和ylab为图形横纵坐标添加标题,与plot函数中xlab,ylab参数一致。
二、几个简单的例子
下面的例子用到ggplot2包中自带的数据集diamonds(砖石方面的数据)。
#下载并安装ggplot2包
if(!suppressWarnings(require('ggplot2'))){
install.packages('ggplots')
require('ggplot2')
}
head(diamonds)
carat:砖石的重量(卡拉);
cut:砖石的切工,共有5种水平;
color:砖石的颜色,共有7个水平;
clarity:砖石的纯度;
depth,table,x,y和z为砖石的5种物理指标,深度、宽度等;
price:砖石的价格
#绘制diamonds数据集中carat与price的散点图
qplot(carat, price, data = diamonds)
#对x和y坐标做对数变换,可以使用log参数
qplot(log(carat), log(price), data = diamonds)
#或者
qplot(carat, price, data = diamonds, log='xy')
绘制砖石重量与体积的散点图
qplot(carat, x*y*z, data = diamonds)
#对diamonds数据集进行抽样
set.seed(1234)
dia_sample <- diamonds[sample(1:nrow(diamonds),1000),]
#为散点图添加图形的其他装饰属性,使用col参数添加颜色
qplot(carat, price, data = dia_sample, col = color)
#为散点图添加图形的其他装饰属性,使用shape参数添加形状属性
qplot(carat, price, data = dia_sample, shape = cut)
#为散点图添加拟合曲线,使用method参数
qplot(carat, price, data = dia_sample,
geom = c('point','smooth'), method = 'lm')
qplot(carat, price, data = dia_sample,
geom = c('point','smooth'),
method = 'loess', span = 0.2)
span越小,平滑线越弯曲(0-->1:很不平滑-->很平滑)
#绘制箱线图,为箱线图添加边缘色(colour参数)和填充色(fill参数)
qplot(color, price/carat, data = diamonds,
geom = 'boxplot', colour = I('red'),
fill = I('blue'))
#绘制线图(这里使用ggplot2包自带的ecnomics数据集,绘制时间序列图)
qplot(date, unemploy/pop, data = economics, geom = 'line')
#或者
qplot(date, unemploy/pop, data = economics, geom = 'path')
#绘制直方图,使用binwidth参数设置直方图的组距,默认纵坐标为频数
qplot(x = carat, data = diamonds, geom = 'histogram',
binwidth = 0.1, xlim = c(0,3))
#用..density..参数设定纵坐标为频率,facets参数实现分面绘图
qplot(x = carat, ..density.., data = diamonds,
facets = color~., geom = 'histogram',
binwidth = 0.1, colour = I('black'),
fill = I('blue'), xlim = c(0,3))
#绘制密度曲线
qplot(x = carat, data = diamonds, geom = 'density')
qplot(x = carat, data = diamonds, geom = 'density',col = color)
#绘制条形图,使用fill参数实现叠加条形图的绘制
qplot(x = color, data = diamonds, geom = 'bar', fill = cut)
#对已经汇总的数据做条形图,需要添加weight参数指定频数
x <- rpois(1000,3)
df <- as.data.frame(table(x))
qplot(x = x, weight = Freq, data = df,
geom = 'bar', binwidth = 1)
qplot(x = cut, y = price, data = diamonds, geom = 'jitter')
qplot(x = cut, y = price, data = diamonds,
geom = 'jitter', alpha = I(0.1))
从上面的绘图情况来看,根据不同的geom值,可以方便快速的绘制想要的统计图形。然而相比于ggplot2包中的ggplot()函数还是存在明显的缺陷,qplot()函数只能使用一个数据集和一组图形属性映射,而ggplot()函数运用图层的思想,可为每个图层指定不同的数据集和图形属性。接下来几期中将重点学习ggplot()函数,并运用该函数实现复杂的图形绘制。
参考资料
ggplot2:数据分析与图形艺术
http://www.zhihu.com/question/24779017