查看原文
其他

初学ggplot2(一)

2015-10-25 刘顺祥 每天进步一点点2015

翻开《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')


#添加alpha参数设定透明度

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


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存